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();