JVM时区已关闭一个小时

在Windows XP机器上使用Java 6更新30。 更新Java或Windows不是一种选择。

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

我尝试过更改JVM参数以及修改deployment.properties文件(更改时区),向环境/系统变量路径添加变量也无效,并尝试使用Oracle提供的时区更新工具。 前三个不会更改任何参数,并且更新程序工具崩溃,并说“无法找到JRE / JDK文件”。

是否有任何其他方式来永久/正确地更改Java正在使用的时间。

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

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


作为前两个选项 - 升级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

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

  • 打开文件domain.xml
  • 找到其他的<jvm-options>标签
  • 添加<jvm-options> -Duser.timezone =“Europe / Berlin”</ jvm-options>(或其他时区)
  • 重启Glassfish并希望它会改变。

  • TL;博士

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

    他们是长安的时代'

    根据更新版本说明,随Olson时区数据版本2011l附带的Java 6 Update 30。 仅供参考,Olson数据库现在被称为'tz数据库'或'tzdata'。

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

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

    ThreeTen-Backport项目

    另一种方法是从java.time类中取出许多技术的后端端口,这些类现在取代了诸如DateCalendar类的麻烦的旧日期时间类。 那些旧的课程现在是遗留下来的,应该避免。 后端端口位于ThreeTen-Backport项目中,并带有自己的tzdb副本。 您可以将此库添加到您的项目中,并根据需要将其替换为未来对tzdata的更新。 请参阅文档以更新tzdb。 顺便说一下,“ThreeTen”是指JSR 310。

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

    Instant

    Instant类表示UTC时间轴上的某个时刻,分辨率为纳秒(小数点后最多九位数字)。

    Instant instant = Instant.now();
    

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

    ZonedDateTime

    应用ZoneId以获取表示特定区域的挂钟时间的ZonedDateTime对象。

    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 )

    在IdeOne.com中查看实时代码。

    指定时区

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

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


    关于java.time

    java.time框架内置于Java 8及更高版本中。 这些类取代了诸如java.util.DateCalendarSimpleDateFormat等麻烦的旧式遗留日期时间类。

    现在处于维护模式的Joda-Time项目建议迁移到java.time类。

    要了解更多信息,请参阅Oracle教程。 并搜索堆栈溢出了很多例子和解释。 规范是JSR 310。

    何处获取java.time类?

  • Java SE 8SE 9及更高版本
  • 内置。
  • 带有捆绑实现的标准Java API的一部分。
  • Java 9增加了一些次要功能和修复。
  • Java SE 6SE 7
  • 大部分java.time功能都在ThreeTen-Backport中移植到Java 6和7。
  • Android的
  • ThreeTenABP项目专门针对Android采用了ThreeTen-Backport(上文提到)。
  • 请参阅如何使用ThreeTenABP ...。
  • 链接地址: http://www.djcxy.com/p/3113.html

    上一篇: JVM Timezone is off by one hour

    下一篇: Convert string to appropriate date with timezone java