如何在Java1.6中正确处理时区和夏令时

如何在Java1.6中正确处理时区和夏令时,java,timezone,save,dst,Java,Timezone,Save,Dst,我们有一个遗留系统,Java 1.6仍然没有升级,但夏令时没有正确实现。我的问题是,在Java1.6中,我们如何正确处理时区和夏令时 任何人都可以在这里分享经验。Oracle有一个特殊的实用程序,可以使用实际的时区信息更新旧版本的JDK和JRE。它被称为,并且与Java1.6完全兼容。您可以在运行时更新DST和时区信息 java -jar tzupdater.jar 请记住,如果您的应用程序是可分发的,它将从用户JDK/JRE获取时区信息。否则会有所帮助。避免遗留日期时间类 与最早版本的Jav

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


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

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

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

避免遗留日期时间类 与最早版本的Java捆绑在一起的旧日期时间类被证明是设计拙劣、混乱和麻烦的。避开它们。它们现在被内置在Java8中的类所取代

三百一十个后场 在项目中,java.time的大部分功能都被移植到了Java6和Java7中。将该库添加到Java 6应用程序中

认为这是一个真实的时间。忘掉你自己的时区吧。将UTC用于大部分业务逻辑、日志记录、数据存储和数据交换。通常仅为向用户演示应用时区

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)。
Instant
是java.time的基本构建块

Instant instant = Instant.now();  // UTC
应用时区。自动为您处理。务必阅读文档以了解行为

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
要了解更多信息,请在堆栈溢出中搜索这些类名以及
ZoneOffset
OffsetDateTime
DateTimeFormatter

更新
tzdata
世界各地时区的定义经常变化,令人惊讶的是变化频繁。而且经常在没有任何预警的情况下发生。(亲爱的政治家们,谢谢你们。)

tzdata
三个后端口 ThreeTen Backport库包含其自己的。Three Ten Backport库偶尔会更新为
tzdata
的新副本。但有时你可能关心的时区可能会在最后一分钟更新。在这种情况下,您需要自己在Three-Ten Backport中更新数据。请参阅此页:

JVM中的tzdata 顺便说一下,JVM也有tzdata的副本。您可能希望对尚未更新到Three Ten Backport的旧代码保持最新。见神谕

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

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

该项目现已启动,建议迁移到java.time

Instant instant = Instant.now();  // UTC
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门针对Android采用了Three Ten Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和