【问题标题】:How to properly handle the timezone and daylight saving time in Java 1.6如何在 Java 1.6 中正确处理时区和夏令时
【发布时间】:2024-01-13 21:51:01
【问题描述】:

我们有一个遗留系统,Java 1.6 仍未升级,但夏令时未正确实现。这是我的问题,在 Java 1.6 中我们如何正确处理时区和夏令时?

任何人都可以在这里分享经验。

【问题讨论】:

    标签: java timezone save dst


    【解决方案1】:

    Oracle 有一个特殊的实用程序,可以使用实际时区信息更新旧版本的 JDK 和 JRE。它被称为TZUpdater,它与java 1.6 完全兼容。您可以更新运行的 DST 和时区信息

    java -jar tzupdater.jar
    

    请记住,如果您的应用程序是可分发的,它将从用户 JDK/JRE 获取时区信息。否则它应该会有所帮助。

    【讨论】:

      【解决方案2】:

      避免使用旧的日期时间类

      与最早的 Java 版本捆绑在一起的旧日期时间类已被证明设计不佳、令人困惑且麻烦。避开他们。它们现在是 legacy,被 Java 8 中内置的 java.time 类所取代。

      ThreeTen-Backport

      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 中搜索这些类名以及 ZoneOffsetOffsetDateTimeDateTimeFormatter

      正在更新tzdata

      世界各地时区的定义经常变化,令人惊讶地经常变化。并且经常在没有预先警告的情况下发生。 (谢谢你们,亲爱的政客们。)

      tzdata 在 ThreeTen-Backport 中

      ThreeTen-Backport 库包含自己的 tzdata time zone database 副本。 ThreeTen-Backport 库偶尔会更新为tzdata 的新副本。但有时您可能关心的时区可能会在最后一刻更新。在这种情况下,您需要自己在 ThreeTen-Backport 中更新数据。请参阅此页面:Update tzdb

      JVM 中的tzdata

      顺便说一句,您的 JVM 也有一个 tzdata 的副本。对于尚未更新到 ThreeTen-Backport 的旧代码,您可能希望保持最新。请参阅 Oracle Timezone Updater Tool

      操作系统中的tzdata

      您的操作系统也可能有自己的 tzdata 副本。您可能还需要为所有其他非 Java 软件更新它。

      关于java.time

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

      Joda-Time 项目现在位于 maintenance mode,建议迁移到 java.time。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      从哪里获得 java.time 类?

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

      【讨论】:

        最近更新 更多