解析 DateFormat 时的 Java 时区

新手上路,请多包涵

我有如下解析日期的代码:

 String ALT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
SimpleDateFormat sdf = new SimpleDateFormat(
                    ALT_DATE_TIME_FORMAT);
Date date = sdf.parse(requiredTimeStamp);

它工作正常,突然,它停止工作了。事实证明,管理员在服务器上进行了一些配置更改,当前返回的日期为“2010-12-27T10:50:44.000-08:00”,上述模式无法对其进行解析。我有两个问题:

第一个是什么模式将解析 JVM 以上述格式返回的日期(具体来说,只是“-08:00”作为时区)?其次,在 linux RHEL 5 服务器上究竟应该在哪里更改此类设置,以便我们知道将来会发生此类更改?

原文由 shipmaster 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 583
2 个回答

另一个应用程序使用 ISO 8601 日期时间格式。我假设其他应用程序向您发送符合 XML 模式的 dateTime 类型(即 ISO 8601)的 XML 响应。现在,众所周知,DateFormat 无法解析此格式。您要么必须使用其他库,如 joda-time(joda-time 是赢家),要么使用其他响应中指定的 FastDateFormat。看看这篇文章 Converting ISO 8601-compliant String to java.util.Date

原文由 Aravind Yarram 发布,翻译遵循 CC BY-SA 3.0 许可协议

tl;博士

OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" )

国际标准化组织 8601

输入字符串格式在 ISO 8601 标准中定义,这是一个日期时间格式系列。

避免旧的日期时间类

问题和其他答案使用与最早版本的 Java 捆绑在一起的旧的过时日期时间类。避开他们。现在被 java.time 类取代。

使用 java.time

您的输入字符串以 offset-from-UTC 结尾。所以我们解析为 OffsetDateTime 对象。

java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。因此无需指定格式化模式。

 OffsetDateTime odt = OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" );

如果您想将此日期时间值视为 UTC 时间轴上的一个时刻,请提取 Instant

 Instant instant = odt.toInstant();

时区是一个偏移量 加上 一组处理异常的规则,例如夏令时 (DST)。如果您有一个时区,请应用 ZoneId 以获得 ZonedDateTime 对象。时间轴上的同一时刻,但通过不同 的挂钟时间 查看。

 ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );  // Same moment on the timeline, but viewed through a different wall-clock time.


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

现在处于 维护模式Joda-Time 项目建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle 教程。并在 Stack Overflow 中搜索许多示例和解释。规范是 JSR 310

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要 java.sql.* 类。

在哪里获取 java.time 类?

  • Java SE 8Java SE 9 和更高版本
    • 内置。
    • 带有捆绑实现的标准 Java API 的一部分。
    • Java 9 添加了一些次要功能和修复。
  • Java SE 6Java SE 7
    • ThreeTen -Backport 中的大部分 java.time 功能都反向移植到 Java 6 和 7。
  • 安卓

ThreeTen-Extra 项目用附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuarter 等等

原文由 Basil Bourque 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题