Guy*_*Guy 7 java date iso8601 simpledateformat
我正在尝试解析一个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";
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我只是在parse()方法中放置一个常量用于测试目的.
所以,这就是我要解析的内容:
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"
Run Code Online (Sandbox Code Playgroud)
从Java的SimpleDateFormat文档中:
ISO 8601时区:
...
对于解析,"Z"被解析为UTC时区指示符.
并且,从描述不同角色的部分:
X - 时区 - ISO 8601时区
编辑
如果使用Android,则不支持"X".
您可以使用此模式(注意Z现在是文字):
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
Run Code Online (Sandbox Code Playgroud)
但是,您将获得当前时区的日期,并在需要时将其转换为UTC.
跳过格式化模式.默认使用标准ISO 8601格式.
Instant.parse( "2015-06-27T13:16:37.363Z" )
Run Code Online (Sandbox Code Playgroud)
您的字符串格式由ISO 8601标准正式定义.
基本上你的问题是这个问题的重复,将符合ISO 8601标准的字符串转换为java.util.Date.
但是你应该知道与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中任何应用程序的任何线程中的任何代码调用时,它可以在运行时期间随时更改TimeZone.setDefault.因此,最好明确指定期望/预期的时区.
在Z对祖鲁你的字符串的结尾很短,是指UTC.本Instant类,可直接解析该格式,以表示UTC时间线,在纳秒的分辨率上一会儿.
String input = "2015-06-27T13:16:37.363Z";
Instant instant = Instant.parse( input );
Run Code Online (Sandbox Code Playgroud)
将时区从UTC更改为某个所需/预期时区.
ZoneID zone = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtMontréal = instant.atZone( zone ) ;
Run Code Online (Sandbox Code Playgroud)
如果您确实需要java.util.Date来实现互操作性,请转换.
java.util.Date utilDate = Date.from( zdtMontréal.toInstant() ) ;
Run Code Online (Sandbox Code Playgroud)
Joda-Time项目现在处于维护模式,团队建议迁移到java.time类:
请注意,从Java SE 8开始,用户被要求迁移到
java.time(JSR-310) - JDK的核心部分,它取代了这个项目.
使用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 ) ;
Run Code Online (Sandbox Code Playgroud)
如果您确实需要java.util.Date来实现互操作性,请转换.
java.util.Date date = dateTime.toDate();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10166 次 |
| 最近记录: |