JVM时区关闭一小时

时间:2015-11-24 18:10:07

标签: java datetime jvm hour

在Windows XP计算机上使用Java 6 update 30。无法更新Java或Windows。

我需要一种方法将内部Java时钟改回一小时以匹配系统时间。该机器在俄罗斯和Windows系统时间是正确的,但Java时间关闭了一个小时,可能是由于DST。

我已尝试changing JVM parameters以及修改deployment.properties文件(更改时区),向环境/系统变量路径添加变量也不起作用,并尝试timezone updater tool由Oracle提供。前三个不更改任何参数,更新程序工具崩溃,并说“找不到JRE / JDK文件”。

还有其他方法可以永久/正确地更改Java使用的时间。

例如: 当前时间:7:20:17 PM TimeZone:sun.util.calendar.ZoneInfo [id =“Europe / Moscow”,offset = 14400000,dstSavings = 0,useDaylight = false,transitions = 78,LastRule = null]

所需时间:下午6:20:17 TimeZone:sun.util.calendar.ZoneInfo [id =“Europe / Moscow”,偏移= 14400000,dstSavings = 0,useDaylight = false,transitions = 78,LastRule = null]

3 个答案:

答案 0 :(得分:0)

作为前两个选项 - 升级JVM并使用tzupdater - 是不可能的,您将不得不使用变通方法。您可以使用user.timezone属性为JVM设置默认时区。您需要将时区设置为距离实际时区一小时的区域,以补偿2014年的变化。

可用的俄罗斯时区

Europe/Kaliningrad
Europe/Moscow
Europe/Samara
Europe/Volgograd
Asia/Yekaterinburg
Asia/Novokuznetsk
Asia/Novosibirsk
Asia/Omsk
Asia/Krasnoyarsk
Asia/Irkutsk
Asia/Yakutsk
Asia/Sakhalin
Asia/Vladivostok
Asia/Anadyr
Asia/Kamchatka
Asia/Magadan

答案 1 :(得分:0)

尝试从Glassfish Java Server获取当前时间并收到错误的时间戳时出现此问题。要更改时区,必须找到domain.xml文件并添加新时区。

  1. 打开文件domain.xml
  2. 查找其他< JVM-选项>标签
  3. 添加< JVM-选项> -Duser.timezone = “欧洲/柏林” < / JVM-选项> (或其他时区)
  4. 重启Glassfish,希望它会改变。

答案 2 :(得分:0)

TL;博士

ZonedDateTime.now( 
    ZoneId.of( "Europe/Moscow" )
)

他们是A-Changin的时代'

根据{{​​3}},

Java 6 Update 30随Olson时区数据版本2011l一起提供。仅供参考,Olson数据库现在称为Update Release Notes或'tzdata'。

从那时起,俄罗斯的时区定义经历了多次变化。这使得Java安装过时了。因此,您必须更新时区数据库或使用替代方案。

你说你试过但未能更新时区数据。

ThreeTen-Backport项目

另一种选择是来自java.time类的大部分技术的后端,现在它取代了麻烦的旧日期时间类,如DateCalendar。那些旧课程现在已经遗留下来,应该避免。后端位于‘tz database’项目中,并带有自己的tzdb副本。您可以将此库添加到项目中,并根据需要将其替换为tzdata的未来更新。请参阅ThreeTen-Backport。顺便说一下," ThreeTen"是指documentation to update tzdb

因此,出于Java代码的目的,您不关心主机操作系统自己的时区数据是否已过时,因为我们没有使用它。同样,对于JVM自己的时区数据,我们没有使用它。通过仅使用ThreeTen-Backport类,我们使用作为该库的一部分提供的时区数据。我们可以轻松地保持时区数据的新鲜度。

Instant

JSR 310类代表Instant中时间轴上的一个时刻,分辨率为UTC(小数部分最多九(9)位)。

Instant instant = Instant.now();
  

instant.toString():2017-01-16T07:43:24.130Z

ZonedDateTime

应用ZoneId获取代表特定区域nanosecondsZonedDateTime对象。

ZoneId z = ZoneId.of( "Europe/Moscow" );
ZonedDateTime zdt = instant.atZone( z );
  

zdt.toString():2017-01-16T10:43:24.130 + 03:00 [欧洲/莫斯科]

作为快捷方式,您可以跳过处理Instant,并致电ZonedDateTime.now( z )

请参阅wall-clock time

指定时区

  

问题:...是否还有其他方法可以永久/正确地更改Java使用的时间

始终传递特定的ZoneId而不是省略任何可选的时区参数。省略时,您隐式依赖于JVM的当前默认时区。可以随时通过JVM中任何应用程序的任何线程中的任何代码更改该默认值。因此,我强烈建议您明确 始终指定所需/预期的时区

关于java.time

live code in IdeOne.com框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacyjava.util.Date和& Calendar

现在位于SimpleDateFormatJoda-Time项目建议迁移到maintenance mode类。

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

从哪里获取java.time类?

  • JSR 310Java SE 8以及之后
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小功能和修复。
  • SE 9Java SE 6
    • 大部分java.time功能都被反向移植到Java 6& 7 {in SE 7
  • ThreeTen-Backport
    • Android项目专门为Android调整 ThreeTen-Backport (如上所述)。
    • 请参阅ThreeTenABP