java不正确的时区

我有一个Java实例,它似乎使用了一个完全不正确的时区。 它使用的是美国/加拉加斯时区,而不是使用Windows正在使用的澳大利亚/悉尼时区。

我首先通过系统时钟检查了Windows时间,然后检查了HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ControlSet001ControlSet002 。 所有都设在悉尼时区。

有人知道这是Java中的错误,还是指其他地方设置的时间?

Java版本是1.6.0_06

确保在启动应用程序时设置JVM的时区:

 -Duser.timezone="Australia/Sydney" 

查看以下链接的信息: http : //techtavern.wordpress.com/2010/04/15/java-and-incorrect-timezone-on-windows-xp/
它表明,JVM中存在一个错误,导致从Windows注册表中读取不正确的默认时区。 还没有错误修复。

您应该更新您的JRE / SDK ,但TZUpdater可能就足够了。

尝试在您的应用中获取默认时区,或手动设置时区(注释行)。

我的小例子:

 import java.text.DateFormat; import java.util.Date; import java.util.Locale; import java.util.TimeZone; public class Main { public static void main(String[] args) { Locale locale = Locale.getDefault(); TimeZone localTimeZone = TimeZone.getDefault(); //TimeZone localTimeZone = TimeZone.getTimeZone("Australia/Sydney"); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale); dateFormat.setTimeZone(localTimeZone); Date rightNow = new Date(); System.out.println(locale.toString() + ": " + dateFormat.format(rightNow)); } } 

我最近遇到了同样的问题,显然这是由于Windows在注册表中代表其时区设置以及Java无法正确解释它的模糊性造成的。

更多细节可以在本文中找到, 该文章还描述了受影响机器的“治愈”:

  • 手动更改日期/时间,然后更改回原始正确时间。
  • 更改时区,然后返回原始时区。
  • 请求从时间服务器自动更新时间。

有这样的问题的历史来来往往,没有合理的解决方案。 在此处查看更多: Windows上的Java不正确的时区错误

编辑:回答Tom和francis:简而言之,Java运行时很难正确地找到计算机上当前时区的工作。

关于时区的Windows注册表信息不可靠,对于依赖于msvcrt.dll和各种msvcrxx.dll的本机Windows API也是如此。 还有Managed(.NET)API需要安装某个版本的.NET Framework,这与Java的可移植性相矛盾。

因此,Java运行时的开发人员很难在Windows上使用当前时区,这可能会持续到微软有一些合作的理由。

如果您希望Java应用程序在任何时区正常工作,请允许用户通过GUI更正时区。

我有同样的错误,当我将我的时区设置为马来半岛标准时间时,JVM给了我委内瑞拉时间时区。

以下修复对我有用:

在注册表编辑器中,将您的时区编辑到另一个时区(我试图添加另一个文本,如“新加坡时间”。您可以在此处找到注册表:

HKEY_LOCAL_MACHINE /系统/ CurrentControlSet /控制/ TimeZoneInformation

然后,我使用控制面板,日期和时间设置将其重置回我想要的时区。 当我回到注册表编辑器时,我可以看到它被恢复为马来半岛标准时间。 我的JVM现在正确读取它…