tl;博士
直到 bug 修复:
OffsetDateTime.parse(
"2018-02-13T10:20:12.120+0000" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" )
)
当错误被修复时:
OffsetDateTime.parse( "2018-02-13T10:20:12.120+0000" )
详
您使用了错误的类。
避免麻烦的旧旧类,如 、 、 和 。现在被java.time类所取代。Date
Calendar
SimpleDateFormat
你使用的ZonedDateTime
类很好,它是java.time的一部分。但它适用于完整时区。输入字符串只有一个与 UTC 的偏移量。相比之下,完整时区是某个区域在不同时间点、过去点、现在点和将来生效的偏移量的集合。例如,在北美大部分地区使用夏令时 (DST),偏移量每年变化两次,因为我们将时钟向前移动一小时,而在春季,当我们将时钟向后移一小时时,偏移量会变小,而在秋季恢复到更长的值。
OffsetDateTime
对于仅偏移量而不是时区,请使用 OffsetDateTime
类。
您的输入字符串符合 ISO 8601 标准。java.time 类在解析/生成字符串时默认使用标准格式。因此,无需指定格式设置模式。
OffsetDateTime odt = OffsetDateTime.parse( "2018-02-13T10:20:12.120+0000" );
好吧,这应该有效。不幸的是,Java 8 中存在一个错误(至少在 Java 8 Update 121 之前),该类无法解析偏移量,从而省略了小时和分钟之间的冒号。所以虫子咬人但不是。因此,在修复程序到达之前,您可以选择两种解决方法:(a)黑客攻击,操作输入字符串,或(b)定义显式格式化模式。+0000
+00:00
技巧:操作输入字符串以插入冒号。
String input = "2018-02-13T10:20:12.120+0000".replace( "+0000" , "+00:00" );
OffsetDateTime odt = OffsetDateTime.parse( input );
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 );
地址:2018-02-13T10:20:12.120Z
顺便说一句,这里有一个提示:我发现,对于许多协议和库,如果你的偏移量总是有冒号,总是有小时和分钟(即使分钟为零),并且总是使用填充零(而不是),你的生活会更容易。-05:00
-5
DateTimeFormatterBuilder
有关通过DateTimeFormatterBuilder
创建的更灵活的格式化程序,请参阅重复问题的出色答案。
Instant
如果要使用始终采用 UTC 的值(并且应该),请提取对象。Instant
Instant instant = odt.toInstant();
ZonedDateTime
如果要通过某个区域的挂钟时间镜头查看该时刻,请应用时区。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );
请参阅此代码在 IdeOne.com 实时运行。
所有这些在许多问题的答案中已经多次涉及。请在发布前彻底搜索堆栈溢出。你会发现几十个,如果不是几百个,的例子。
关于 java.time
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-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。