当前位置: 首页 > 知识库问答 >
问题:

JVM时区关闭一小时

胥承
2023-03-14

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

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

我尝试过更改JVM参数以及修改部署。属性文件(用于更改时区),将变量添加到环境/系统变量路径也不起作用,并尝试使用Oracle提供的时区更新工具。前三个没有改变任何参数,更新工具崩溃,并表示“找不到JRE/JDK文件”。

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

示例:当前时间:下午7:20:17时区:太阳。util。日历ZoneInfo[id=“欧洲/莫斯科”,偏移量=14400000,DSTSaves=0,useDaylight=false,转换=78,LastRule=null]

要求时间:下午6:20:17时区:太阳。util。日历ZoneInfo[id=“欧洲/莫斯科”,偏移量=14400000,DSTSaves=0,useDaylight=false,转换=78,LastRule=null]

共有3个答案

萧嘉禧
2023-03-14
ZonedDateTime.now( 
    ZoneId.of( "Europe/Moscow" )
)

根据更新发行说明,Olson时区数据版本2011l附带了Java 6 Update 30。仅供参考,奥尔森数据库现在被称为“tz数据库”或“tzdata”。

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

你说你试图更新时区数据,但失败了。

另一种选择是java.time类中的大部分技术的后端端口,这些技术现在取代了麻烦的旧日期时间类,如DateCalendar。那些旧的阶级现在是遗产,应该避免。后端端口可以在ThreePre-Backport项目中找到,并携带自己的tzdb副本。您可以将这个库添加到您的项目中,并根据需要用tzdata的未来更新替换它。请参见更新tzdb的留档。顺便说一下,“三个十”指的是JSR 310。

因此,对于您的Java代码,您不关心主机操作系统自己的时区数据是否过时,因为我们不使用它。JVM自己的时区数据也是如此,我们不使用它。通过仅使用ThreePre-Backport类,我们使用作为该库一部分的时区数据。我们可以很容易地保持时区数据的新鲜。

Instant类以UTC表示时间线上的一个时刻,分辨率为纳秒(最多九(9)位小数)。

Instant instant = Instant.now();

瞬间toString():2017-01-16T07:43:24.130Z

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

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

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

作为一种快捷方式,您可以跳过处理即时,然后调用ZoneDateTime。现在(z)

请参阅ideO中的实时代码ne.com.

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

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

爪哇。时间框架内置于Java8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,比如java。util。日期日历

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

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多html" target="_blank">示例和解释。规范是JSR 310。

在哪里获得java.time类?

  • Java SE 8和SE 9及更高版本
  • java的大部分内容。时间功能被重新移植到Java 6
  • ThreeTenABP项目专门为Android改编了ThreeTen Backport(如上所述)
  • 了解如何使用ThreeTenABP
云俊名
2023-03-14

当试图从Glassfish Java服务器获取当前时间并收到错误的时间戳时,会出现此问题。为了改变时区,有必要找到域名。xml文件并添加一个新时区。

  1. 打开文件域。xml
丁绪
2023-03-14

由于前两个选项——升级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
 类似资料:
  • PHP 5.2.17。服务器上的时间是9:40,时区是欧洲/莫斯科: php.ini时区设置为:date.timezone欧洲/莫斯科 date_default_timezone_set()设置的时区是欧洲/莫斯科 但是date()函数返回一小时后的时间: 输出: 我该如何解决这个问题?我已经尝试安装了最新的 /usr/share/zoneinfo,结果相同

  • 本文向大家介绍说一下 JVM 运行时数据区?相关面试题,主要包含被问及说一下 JVM 运行时数据区?时的应答技巧和注意事项,需要的朋友参考一下 不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分: 程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过

  • 我正在学习Java 1.5中引入的ExecutorService 下面的例子似乎违背了预期的行为: 查看此方法的java文档: 尝试停止所有正在执行的任务,停止正在等待的任务的处理,并返回正在等待执行的任务的列表。 此方法不等待主动执行的任务终止。请使用等待终止来完成此操作。 除了尽最大努力尝试停止处理积极执行的任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt取消,因

  • 运行时数据区包括堆、方法区、栈、本地方法栈、程序计数器。 1、堆 堆解决的是对象实例存储的问题,垃圾回收器管理的主要区域。 2、方法区 方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。 3、栈 栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表、操作数栈、动态链接、方法出口等信息。 (1)栈帧 每个方法从调用到执行的过程就是一个栈

  • 当我打开netrw并选择一个文件时,它会在一个新缓冲区中打开。这意味着如果我转到之前打开的缓冲区,我将返回netrw,而不是我之前编辑的文件。 我如何改变这种行为,这样我就可以在netrw的缓冲区中打开新文件,或者关闭我用来打开文件的缓冲区?

  • 我正在尝试将ZonedDateTime(EST)转换为日期(UTC)我看到3月的13和14日历日期有1小时的Rest时间 SystemDefault-UTC 实际结果: EST->2021-03-13T19:00-05:00[美国/纽约] UTC->太阳3月14日00:00:00 UTC 2021 EST->2021-03-14T19:00-04:00[美国/纽约] UTC->太阳3月14日23: