tl;博士
直到错误被修复:
OffsetDateTime.parse(
"2013-12-18T00:41:38-0500" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" )
)
bug 修复后:
OffsetDateTime.parse( "2013-12-18T00:41:38-0500" )
java.time
现代方法使用 java.time 类。
OffsetDateTime odt = OffsetDateTime.parse( "2013-10-25T15:00:00+02:00" ) ;
这应该也适用于2013-12-18T00:41:38-0500。不幸的是,事实并非如此。 OffsetDateTime 类有一个错误,当从 UTC 偏移的部分在小时和分钟之间缺少可选冒号时会咬人。所以2013-12-18T00:41:38-05:00 可以工作,但2013-12-18T00:41:38-0500 不行。
作为一种解决方法,定义格式模式。
String input = "2013-12-18T00:41:38-0500" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" ) ;
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
odt.toString(): 2013-12-18T00:41:38-05:00
有关更多讨论,请参阅类似问题:
乔达时间
更新:Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。本节原封不动地保留为历史。
仅供参考,如果您使用 Joda-Time 而不是臭名昭著的麻烦 java.util.Date/Calendar 类,则可以简单地将 ISO 8601 字符串直接传递给 DateTime 构造函数,而无需格式化程序。 Joda-Time 使用 ISO 8601 作为其默认值。
DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime = new DateTime( "2007-03-01T13:00:00Z", timeZone );
如果您想在不调整时区的情况下以 UTC 工作,只需从上面的代码中省略 timeZone 内容。
如果您需要 java.util.Date 对象用于其他目的,请从 Joda-Time 转换。
java.util.Date date = dateTime.toDate();
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。