如何在Java 1.6中正确处理时区和夏令时

时间:2016-10-10 16:56:22

标签: java timezone save dst

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

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

2 个答案:

答案 0 :(得分:2)

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

java -jar tzupdater.jar

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

答案 1 :(得分:0)

避免遗留日期时间类

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

ThreeTen-反向移植

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport项目中的7。将该库添加到Java 6应用程序中。

UTC视为 One True Time 。忘记你自己的时区。将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 );

要了解更多信息,请搜索这些类名称以及ZoneOffsetOffsetDateTimeDateTimeFormatter的Stack Overflow。

正在更新tzdata

世界各地的时区定义经常发生频繁变化。并且通常几乎没有预先发生。 (谢谢,亲爱的政治家。)

ThreeTen-Backport中的

tzdata

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.Calendar和& java.text.SimpleDateFormat

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore