Parsing ISO 8601 date format like 2015-06-27T13:16:37.363Z in Java
我试图使用
这是我目前的代码:
1 2 3 4 5 6 7 8 9 | 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()方法中放置一个常量用于测试目的。
所以,这就是我要解析的内容:
2015-06-27T13:16:37.363Z
这是我使用的
yyyy-MM-ddEHH:mm:ss.zzzz
我一直得到ParseException。
我知道这可能是因为最后的.zzzz,但我不知道.363Z可能代表什么,所以我只是使用了一些随机字母。 馊主意。
我会非常感谢你的帮助。 谢谢!
TL;博士
跳过格式化模式。默认使用标准ISO 8601格式。
1 | Instant.parse("2015-06-27T13:16:37.363Z" ) |
ISO 8601
您的字符串格式由ISO 8601标准正式定义。
基本上你的问题是这个问题的重复,将符合ISO 8601标准的字符串转换为java.util.Date。
备择方案
eugenioy的回答是正确的。
但是你应该知道与Java捆绑在一起的旧的java.util.Date/.Calendar/java.text.SimpleDateFormat类是非常麻烦的,应该避免。
过时的课程
这些旧类现在已经过时了,首先是第三方Joda-Time库,现在是Java 8及更高版本中内置的新java.time包(教程)(受Joda-Time启发,由JSR 310定义,扩展为ThreeTen-Extra项目)。
在解析/生成日期时间值的字符串表示时,java.time和Joda-Time都使用ISO 8601标准作为其默认值。因此代码很简单,不需要自定义格式化程序对象。不需要那些导致你的例外的格式错误。
时区
java.time和Joda-Time都有一个分区的日期时间类,它可以理解分配的时区(与java.util.Date不同)。如果未指定一个,则分配JVM的当前默认时区。
请注意JVM的当前默认时区可以随时更改。它可以在部署时更改,默认为主机操作系统设置。当JVM中任何应用程序的任何线程中的任何代码调用
java.time
字符串末尾的
1 2 |
将时区从UTC更改为某个所需/预期时区。
1 2 | ZoneID zone = ZoneId.of("America/Montreal" ) ; ZonedDateTime zdtMontréal = instant.atZone( zone ) ; |
如果您确实需要java.util.Date来实现互操作性,请转换。
乔达时间
Joda-Time项目现在处于维护模式,团队建议迁移到java.time类:
Note that from Java SE 8 onwards, users are asked to migrate to
java.time (JSR-310) - a core part of the JDK which replaces this project.
使用Joda-Time 2.8.1的示例代码。
1 2 3 | 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来实现互操作性,请转换。
1 |
试试这种模式(注意末尾的X和中间的'T'):
1 | "yyyy-MM-dd'T'HH:mm:ss.SSSX" |
从Java的SimpleDateFormat文档中:
ISO 8601 Time zone:
...
For parsing,"Z" is parsed as the UTC time zone designator.
并且,从描述不同角色的部分:
X - Time zone - ISO 8601 time zone
编辑
如果使用Android,则不支持"X"。
您可以使用此模式(注意Z现在是文字):
1 | "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" |
但是,您将获得当前时区的日期,并在需要时将其转换为UTC。