【发布时间】:2024-01-13 21:51:01
【问题描述】:
我们有一个遗留系统,Java 1.6 仍未升级,但夏令时未正确实现。这是我的问题,在 Java 1.6 中我们如何正确处理时区和夏令时?
任何人都可以在这里分享经验。
【问题讨论】:
我们有一个遗留系统,Java 1.6 仍未升级,但夏令时未正确实现。这是我的问题,在 Java 1.6 中我们如何正确处理时区和夏令时?
任何人都可以在这里分享经验。
【问题讨论】:
Oracle 有一个特殊的实用程序,可以使用实际时区信息更新旧版本的 JDK 和 JRE。它被称为TZUpdater,它与java 1.6 完全兼容。您可以更新运行的 DST 和时区信息
java -jar tzupdater.jar
请记住,如果您的应用程序是可分发的,它将从用户 JDK/JRE 获取时区信息。否则它应该会有所帮助。
【讨论】:
与最早的 Java 版本捆绑在一起的旧日期时间类已被证明设计不佳、令人困惑且麻烦。避开他们。它们现在是 legacy,被 Java 8 中内置的 java.time 类所取代。
ThreeTen-Backport 项目中的大部分 java.time 功能都向后移植到 Java 6 和 7。将该库添加到您的 Java 6 应用程序中。
将UTC 视为真正的时间。忘记你自己的时区。将 UTC 用于您的大部分业务逻辑、日志记录、数据存储和数据交换。一般只应用一个时区来展示给用户。
Instant 类表示UTC 中时间轴上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。 Instant 是 java.time 的基本构建块。
Instant instant = Instant.now(); // UTC
应用时区。 Daylight Saving Time (DST) 会自动为您处理。请务必阅读文档以了解行为。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
要了解更多信息,请在 Stack Overflow 中搜索这些类名以及 ZoneOffset、OffsetDateTime 和 DateTimeFormatter。
tzdata
世界各地时区的定义经常变化,令人惊讶地经常变化。并且经常在没有预先警告的情况下发生。 (谢谢你们,亲爱的政客们。)
tzdata 在 ThreeTen-Backport 中ThreeTen-Backport 库包含自己的 tzdata time zone database 副本。 ThreeTen-Backport 库偶尔会更新为tzdata 的新副本。但有时您可能关心的时区可能会在最后一刻更新。在这种情况下,您需要自己在 ThreeTen-Backport 中更新数据。请参阅此页面:Update tzdb。
tzdata
顺便说一句,您的 JVM 也有一个 tzdata 的副本。对于尚未更新到 ThreeTen-Backport 的旧代码,您可能希望保持最新。请参阅 Oracle Timezone Updater Tool。
tzdata
您的操作系统也可能有自己的 tzdata 副本。您可能还需要为所有其他非 Java 软件更新它。
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,例如 java.util.Date、.Calendar 和 java.text.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。
【讨论】: