Time Java时间落后一小时
我有一个非常依赖Java的应用程序。我们做了大量的日志记录、数据库插入等工作。在白昼时间切换之后,我们注意到所有Java时间都落后了大约一个小时。我们已经发布了Jre版本的1.6_18。我认为这个问题在Java的早期版本中得到了解决。如果对此有任何修补程序,请建议可以执行的操作。时区信息会定期修改。Java 6 update 18可能会为您的位置设置过时的DST 升级至最新版本()或运行该工具 编辑:我刚刚发现Oracle提供了一个。如果您的应用程序绝对必须有最新的TZ数据,请注意这一点。tl;博士Time Java时间落后一小时,time,java,Time,Java,我有一个非常依赖Java的应用程序。我们做了大量的日志记录、数据库插入等工作。在白昼时间切换之后,我们注意到所有Java时间都落后了大约一个小时。我们已经发布了Jre版本的1.6_18。我认为这个问题在Java的早期版本中得到了解决。如果对此有任何修补程序,请建议可以执行的操作。时区信息会定期修改。Java 6 update 18可能会为您的位置设置过时的DST 升级至最新版本()或运行该工具 编辑:我刚刚发现Oracle提供了一个。如果您的应用程序绝对必须有最新的TZ数据,请注意这一点。tl;
- 你的电脑可能已经过时了
- 使用类的名称。
- 看
- 包括最新的“tz”数据库
- 避免使用最早的Java
- 用于您的大部分工作
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
与时区无关。ALocale
定义了(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。差异在此页面上显示:我没有在该差异中看到任何特定于您的时区的内容,但请尝试一下,它可能会有所帮助。需要考虑的另一件事是:您可能合理地假设您的应用程序正在特定时区运行,但您的假设可能是错误的。在运行时反思beastjava.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 );