我们有一个遗留系统,Java 1.6仍未升级,但夏令时未正确实施。这是我的问题,在Java 1.6中我们如何正确处理时区和夏令时?
任何人都可以在这里分享经验。
答案 0 :(得分:2)
Oracle有一个特殊的实用程序,可以使用实际的时区信息更新旧版本的JDK和JRE。它被称为TZUpdater,它与java 1.6完全兼容。您可以更新运行的DST和时区信息
java -jar tzupdater.jar
请记住,如果您的应用程序是可分发的,它将从用户JDK / JRE获取时区信息。否则它应该有所帮助。
答案 1 :(得分:0)
与最早版本的Java捆绑在一起的旧日期时间类已被证明设计不当,令人困惑且麻烦。避免他们。它们现在是legacy,取而代之的是Java 8中内置的java.time类。
大部分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 );
要了解更多信息,请搜索这些类名称以及ZoneOffset
,OffsetDateTime
和DateTimeFormatter
的Stack Overflow。
tzdata
世界各地的时区定义经常发生频繁变化。并且通常几乎没有预先发生。 (谢谢,亲爱的政治家。)
ThreeTen-Backport中的tzdata
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。