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文件并添加一个新的时区。
TL;博士
ZonedDateTime.now(
ZoneId.of( "Europe/Moscow" )
)
他们是长安的时代'
根据更新版本说明,随Olson时区数据版本2011l附带的Java 6 Update 30。 仅供参考,Olson数据库现在被称为'tz数据库'或'tzdata'。
此后,俄罗斯的时区定义经历了多次变化。 这会使您的Java安装过时。 因此,您必须更新时区数据库或使用替代方法。
你说你尝试过但未能更新时区数据。
ThreeTen-Backport项目
另一种方法是从java.time类中取出许多技术的后端端口,这些类现在取代了诸如Date
和Calendar
类的麻烦的旧日期时间类。 那些旧的课程现在是遗留下来的,应该避免。 后端端口位于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.Date
, Calendar
和SimpleDateFormat
等麻烦的旧式遗留日期时间类。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。 并搜索堆栈溢出了很多例子和解释。 规范是JSR 310。
何处获取java.time类?