Java JVM时区关闭一小时

Java JVM时区关闭一小时,java,datetime,jvm,hour,Java,Datetime,Jvm,Hour,在Windows XP计算机上使用Java 6 update 30。更新Java或Windows不是一个选项 我需要一种方法将内部Java时钟向后更改一小时以匹配系统时间。机器在俄罗斯,Windows系统时间正确,但Java时间缩短了一个小时,可能是因为DST 我尝试过修改deployment.properties文件(以更改时区),将变量添加到环境/系统变量路径也不起作用,并尝试了Oracle提供的方法。前三个没有改变任何参数,更新工具崩溃,并说“找不到JRE/JDK文件” 有没有其他方法可以

在Windows XP计算机上使用Java 6 update 30。更新Java或Windows不是一个选项

我需要一种方法将内部Java时钟向后更改一小时以匹配系统时间。机器在俄罗斯,Windows系统时间正确,但Java时间缩短了一个小时,可能是因为DST

我尝试过修改deployment.properties文件(以更改时区),将变量添加到环境/系统变量路径也不起作用,并尝试了Oracle提供的方法。前三个没有改变任何参数,更新工具崩溃,并说“找不到JRE/JDK文件”

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

例如: 当前时间:下午7:20:17时区:sun.util.calendar.ZoneInfo[id=“欧洲/莫斯科”,偏移量=14400000,DSTSAVAINGS=0,useDaylight=false,transitions=78,LastRule=null]


所需时间:下午6:20:17时区:sun.util.calendar.ZoneInfo[id=“Europe/Moscow”,offset=14400000,dstsavage=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服务器获取当前时间并收到错误的时间戳时,会出现此问题。要更改时区,必须找到domain.xml文件并添加新时区

  • 打开文件domain.xml
  • 查找其他标记
  • 添加-Duser.timezone=“欧洲/柏林”(或其他时区)
  • 重新启动Glassfish,希望它会改变 tl;博士 《时代》杂志 据报道,Olson时区数据版本2011l附带了Java6更新30。仅供参考,奥尔森数据库现在被称为or“tzdata”

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

    您说您尝试更新时区数据,但失败

    三十后港计划 另一种选择是java.time类的许多技术的后端,这些类现在取代了麻烦的旧日期时间类,如
    date
    Calendar
    。这些旧类现在是遗留的,应该避免。在项目中可以找到后端端口,它携带自己的
    tzdb
    副本。您可以将此库添加到项目中,并根据需要将其替换为tzdata的未来更新。看。顺便说一下,“三个十”指的是

    因此,就Java代码而言,您并不关心主机操作系统自己的时区数据是否过期,因为我们没有使用它。对于JVM自己的时区数据也是如此,我们没有使用它。通过只使用三个Backport类,我们使用作为该库的一部分提供的时区数据。我们可以很容易地保持时区数据的新鲜

    Instant
    该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

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

    ZoneDateTime
    应用
    ZoneId
    以获取表示特定区域的时间的
    zoneDateTime
    对象

    ZoneId z = ZoneId.of( "Europe/Moscow" );
    ZonedDateTime zdt = instant.atZone( z );
    
    zdt.toString():2017-01-16T10:43:24.130+03:00[欧洲/莫斯科]

    作为快捷方式,您可以跳过处理
    即时
    ,然后调用
    ZoneDateTime.now(z)

    指定时区 问题:…有没有其他方法可以永久/正确地更改Java使用的时间

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


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

    该项目现已启动,建议迁移到类

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

    从哪里获得java.time类

    • 后来
      • 内置的
      • 标准JavaAPI的一部分,带有捆绑实现
      • Java9添加了一些次要功能和修复
      • 大部分java.time功能都在中向后移植到Java6和Java7
      • 该项目专门为Android采用了ThreeTen Backport(如上所述)

    在您的“当前”和“必需”示例中,我看不到
    时区对象有任何差异。如果问题出在时区上,那么应该会有一些不同。你是对的,你需要更新你的时区文件,因为俄罗斯时间在去年发生了变化。因此,您需要找出使用tzupdater的错误。你到底是如何运行它的?结果是什么?当我运行tzupdater工具时,我得到的唯一输出是找不到JRE/JDK文件。该工具似乎只适用于linux机器,因为它必须使用make。Java使用tzdata,但不使用tzcode。它使用自己的时区信息格式,因此需要tzupdater之类的工具。
    
    Instant instant = Instant.now();
    
    ZoneId z = ZoneId.of( "Europe/Moscow" );
    ZonedDateTime zdt = instant.atZone( z );