parsingISO 8601date格式,如2015-06-27T13:16:37.363Z in Java
我想parsing一个String
使用SimpleDateFormat
。
这是我现在的代码:
public String getCreatedDateTime() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-ddEHH:mm:ss.zzzz"); try { Date date = simpleDateFormat.parse("2015-06-27T13:16:37.363Z"); return date.toString(); } catch (ParseException e) { return "Error parsing date"; } }
正如你所看到的,我只是在parse()方法中添加一个常量来进行testing。
所以,这是我想parsing的:
2015-06-27T13:16:37.363Z
这是我正在使用的SimpleDateFormat
模式:
YYYY-MM-ddEHH:MM:ss.zzzz
我不断收到ParseException。
我知道这是因为最后的.zzzz是可以接受的,但是我不知道.363Z可能会代表什么,所以我只是用了一些随机字母。 馊主意。
我会很感激你的帮助。 谢谢!
试试这个模式(注意X的末尾和'T'的中间):
"yyyy-MM-dd'T'HH:mm:ss.SSSX"
从Java的SimpleDateFormat的文档 :
ISO 8601时区:
…
对于parsing,“Z”被parsing为UTC时区指示符。
而且,从描述不同angular色的部分来看:
X – 时区 – ISO 8601时区
编辑
如果使用Android,则不支持“X”。
你可以使用这个模式(现在注意Z是一个字面值):
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
但是,你会得到当前时区的date,并需要将其转换为UTC。
ISO 8601
您的string格式由ISO 8601标准正式定义。
基本上你的问题是这个问题的重复, 将符合ISO 8601标准的string转换为java.util.Date 。
备择scheme
由eugenioy 答案是正确的。
但是您应该知道,Java捆绑的java.util.Date/.Calendar/java.text.SimpleDateFormat类是非常麻烦的,应该避免。
过时的类
那些旧的类现在已经过时了,首先是第三方的Joda-Time库,现在由Java 8及更高版本内置的新Java时间包 ( Tutorial )(受JSR 310定义的Joda-Time的启发, ThreeTen-Extra项目)。
parsing/生成date时间值的string表示时,java.time和Joda-Time都将ISO 8601标准用作其默认值。 所以代码很简单,不需要自定义的格式化对象。 不需要那些造成你的exception的格式。
时区
java.time和Joda-Time都有一个分区的date时间类,它可以理解分配的时区(与java.util.Date不同)。 如果您不指定,则分配JVM当前的默认时区。
请注意,JVM的当前默认时区可以随时更改。 它可以在部署时更改,默认为主机操作系统设置。 它可以在运行时任何时候改变,当JVM中的任何应用程序的任何线程中的任何代码调用TimeZone.setDefault
。 所以更好地明确分配一个期望/预期的时区。
java.time
string末尾的Z
是祖鲁语的缩写,意思是UTC。 Instsnt
类可以直接parsing该格式,以UTC为单位在时间轴上表示一个分辨率为纳秒的时刻。
String input = "2015-06-27T13:16:37.363Z ) ; Instant instant = Instant.parse( input );
将时区从UTC更改为某个所需的/预期的时区。
ZoneID zone = ZoneId.of( "America/Montreal" ) ; ZonedDateTime zdtMontréal = instant.atZone( zone ) ;
如果你真的需要一个java.util.Date来实现互操作性,请转换。
java.util.Date utilDate = Date.from( zdtMontréal.toInstant() ) ;
乔达时间
Joda-Time项目现在处于维护模式,团队build议迁移到java.time类。
使用Joda-Time的示例代码2.8.1。
String input = "2015-06-27T13:16:37.363Z" ; DateTimeZone zone = DateTimeZone.UTC ; // Or: DateTimeZone.forID( "America/Montreal" ) ; DateTime dateTime = new DateTime( input, zone ) ;
如果你真的需要一个java.util.Date来实现互操作性,请转换。
java.util.Date date = dateTime.toDate();