Time Java时间落后一小时

Time Java时间落后一小时,time,java,Time,Java,我有一个非常依赖Java的应用程序。我们做了大量的日志记录、数据库插入等工作。在白昼时间切换之后,我们注意到所有Java时间都落后了大约一个小时。我们已经发布了Jre版本的1.6_18。我认为这个问题在Java的早期版本中得到了解决。如果对此有任何修补程序,请建议可以执行的操作。时区信息会定期修改。Java 6 update 18可能会为您的位置设置过时的DST 升级至最新版本()或运行该工具 编辑:我刚刚发现Oracle提供了一个。如果您的应用程序绝对必须有最新的TZ数据,请注意这一点。tl;

我有一个非常依赖Java的应用程序。我们做了大量的日志记录、数据库插入等工作。在白昼时间切换之后,我们注意到所有Java时间都落后了大约一个小时。我们已经发布了Jre版本的1.6_18。我认为这个问题在Java的早期版本中得到了解决。如果对此有任何修补程序,请建议可以执行的操作。

时区信息会定期修改。Java 6 update 18可能会为您的位置设置过时的DST

升级至最新版本()或运行该工具

编辑:我刚刚发现Oracle提供了一个。如果您的应用程序绝对必须有最新的TZ数据,请注意这一点。

tl;博士
  • 你的电脑可能已经过时了
  • 使用类的名称。
    • 包括最新的“tz”数据库
    • 避免使用最早的Java
  • 用于您的大部分工作
使用UTC 想象一下“一个真实的时间”。特定时区的任何日期时间都是UTC的派生。在工作中做编程或系统管理工作时,忘记自己的本地时区。我强烈建议在物理和数字桌面上都添加一个显示UTC的时钟。必要时,请使用网站,如

大多数业务逻辑、日志记录、数据存储、数据交换和数据库持久性都应该使用UTC。调整到仅用于演示的时区

避免旧的日期时间类 避免与最早版本的Java捆绑在一起的旧遗留日期时间类。现在被java.time类取代

Instant
该类表示时间线上的一个时刻,分辨率为

指定时区 Java虚拟机具有当前默认时区。这可能在启动时从主机操作系统获取。也可以通过配置设置在启动时进行设置。或者它可能随时被JVM中任何应用程序的任何线程中的任何代码所更改——在执行过程中影响所有其他代码

考虑到JVM当前的默认时区是变化的,并且超出了程序员的控制范围,所以千万不要依赖它始终指定所需/预期时区

通常,最好将服务器主机操作系统设置为UTC时区,但同样,在编程中不要依赖于此

ZoneDateTime
要将
即时
调整为时区,请生成
ZonedDateTime
对象

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
调用
toString
以生成标准格式的字符串。对于其他格式,请搜索类
DateTimeFormatter
的堆栈溢出

更新您的
tz
时区数据库 时区定义和它们的异常情况,如频繁变化,出人意料地频繁

Oracle定期发布Java更新,其中包括。如果您无法安装这些Java更新,或者如果一些粗心的政客在最后一分钟对区域进行了更改,那么您可以使用Oracle的手动更新Java

Locale
要知道,
Locale
与时区无关。A
Locale
定义了(A)用于翻译的人类语言,以及(b)决定缩写、标点符号和部件顺序等问题的文化规范。因此,在使用
DateTimeFormatter
类生成字符串时,只需要
Locale

Locale l = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );
因此,时区定义日期时间值的含义,而
Locale
定义其表示

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

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

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中(请参阅)


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如
Interval
YearWeek
YearQuarter
,等等。

您能发布代码中获得意外结果的部分吗?这只是一个猜测,但可能是您的默认日期/时间设置为错误的时区,或者不识别夏令时,或者其他一些小东西。您的应用程序使用的是什么语言环境?@Synesso-是的,这就是我的意思。:)哎呀,我想说的是时区,不是区域设置最好是登录和跟踪,而不是在任何一个时区。时区和夏令时(DST)经常被修改。此外,JVM中任何应用程序的任何线程中的任何代码都可以更改当前默认时区。调用
Instant.now()
以获取UTC中的当前时刻。这适用于东部标准时间的机器,设置更改的频率是多少?Java 6 update 18具有Olsen TZ数据2009s。Java 6 update 25具有Olsen TZ数据2011b。差异在此页面上显示:我没有在该差异中看到任何特定于您的时区的内容,但请尝试一下,它可能会有所帮助。需要考虑的另一件事是:您可能合理地假设您的应用程序正在特定时区运行,但您的假设可能是错误的。在运行时反思beast
java.util.TimeZone.getDefault().getID()
以确保绝对可靠。根据时区更新工具页面,“每次执行都会修改JDK/JRE软件的单个映像。”()有关于如何在同一系统上跨多个JRE应用tz更新的说明。(个人而言,为了安全起见,我会一次做一个)。@user737159这就是为什么通常最好将服务器保持在UTC时区(如果没有UTC,则设置为冰岛雷克雅未克)。保持冷静
Locale l = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );