Iva*_*van 11 java datetime parsing iso8601 java-8
我对java 8日期格式/解析功能有点沮丧.我试图找到杰克逊配置并DateTimeFormatter解析 "2018-02-13T10:20:12.120+0000"字符串到任何Java 8日期,并没有找到它.
这是java.util.Date一个很好的例子:
Date date = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZZZ")
.parse("2018-02-13T10:20:12.120+0000");
Run Code Online (Sandbox Code Playgroud)
相同的格式不适用于新的日期时间api
ZonedDateTime dateTime = ZonedDateTime.parse("2018-02-13T10:20:12.120+0000",
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss.SSSZZZ"));
Run Code Online (Sandbox Code Playgroud)
我们应该能够以适合FE UI应用程序的任何格式格式化/解析日期.也许我误解或错误的东西,但我认为java.util.Date提供更多的格式灵活性和更容易使用.
Bas*_*que 22
直到bug被修复:
OffsetDateTime.parse(
"2018-02-13T10:20:12.120+0000" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" )
)
Run Code Online (Sandbox Code Playgroud)
当错误修复时:
OffsetDateTime.parse( "2018-02-13T10:20:12.120+0000" )
Run Code Online (Sandbox Code Playgroud)
您使用的是错误的类.
避免麻烦的旧的遗留类,如Date,Calendar和SimpleDateFormat.现在取代了java.time类.
ZonedDateTime你使用的类很好,它是java.time的一部分.但它适用于全时区.您的输入字符串只有一个与UTC的偏移量.相比之下,全时区是对不同时间点,过去,现在和将来的区域有效的偏移的集合.例如,在北美大部分地区使用夏令时(DST)时,每年两次的偏差会在春季变小,因为我们将时钟向前移动一小时,而在秋季我们将时钟向后移动时恢复到更长的值小时.
OffsetDateTime仅对于偏移而不是时区,请使用OffsetDateTime该类.
您的输入字符串符合ISO 8601标准.在解析/生成字符串时,java.time类默认使用标准格式.因此无需指定格式化模式.
OffsetDateTime odt = OffsetDateTime.parse( "2018-02-13T10:20:12.120+0000" );
Run Code Online (Sandbox Code Playgroud)
那应该是有效的.遗憾的是,Java 8中存在一个错误(至少通过Java 8 Update 121),该类无法解析在小时和分钟之间省略冒号的偏移量.所以虫子咬了+0000但不是+00:00.因此,在修复程序到达之前,您可以选择两种解决方法:(a)hack,操作输入字符串,或(b)定义显式格式化模式.
hack:操纵输入字符串以插入冒号.
String input = "2018-02-13T10:20:12.120+0000".replace( "+0000" , "+00:00" );
OffsetDateTime odt = OffsetDateTime.parse( input );
Run Code Online (Sandbox Code Playgroud)
DateTimeFormatter更强大的解决方法是在DateTimeFormatter对象中定义和传递格式化模式.
String input = "2018-02-13T10:20:12.120+0000" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" );
OffsetDateTime odt = OffsetDateTime.parse( input , f );
Run Code Online (Sandbox Code Playgroud)
odt.toString():2018-02-13T10:20:12.120Z
顺便说一句,这里有一个提示:我发现使用许多协议和库,如果你的偏移总是有冒号,你的生活会更容易,总是有小时和分钟(即使分钟为零),并且总是使用填充零(-05:00而不是-5).
DateTimeFormatterBuilder对于更灵活的格式化程序,通过创建DateTimeFormatterBuilder,请参阅这个关于重复问题的优秀答案.
Instant如果要使用始终为UTC(并且应该)的值,请提取Instant对象.
Instant instant = odt.toInstant();
Run Code Online (Sandbox Code Playgroud)
ZonedDateTime如果您想通过某个区域的挂钟时间镜头查看该时刻,请应用时区.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );
Run Code Online (Sandbox Code Playgroud)
请参阅IdeOne.com上的此代码.
在许多问题的答案中,所有这些都已被多次涵盖.请在发布前彻底搜索Stack Overflow.你会发现很多甚至数百个例子.
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.
| 归档时间: |
|
| 查看次数: |
2109 次 |
| 最近记录: |