时区在Windows服务器中无法正常工作

时间:2013-04-30 14:28:07

标签: java

如果在Windows机器上运行此代码,它的工作正常:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()));

显示日期&时间与时钟相同,但如果我在Windows Server上运行,它会显示-2小时的时间。

我尝试将时区设置为,

TimeZone timeZone = TimeZone.getTimeZone("Europe/Vienna");
sdf.setTimeZone(timeZone);
Then, it shows same as clock time.

我怀疑的是,为什么在Windows Server中默认不占用时钟时区。

4 个答案:

答案 0 :(得分:3)

它应始终采用正在运行的计算机的时区,但在某些情况下,它会因报告herehere而失败。如果您确定服务器时区正确但Java使用的时区不同,则可以从命令行强制选择默认时区:

-Duser.timezone="YOUR_TIME_ZONE_HERE"

by code。您也可以尝试使用Oracle的Timezone Updater Tool

要查看Java使用的时区:

System.out.println(TimeZone.getDefault());

答案 1 :(得分:2)

时区设置对计算机看到的时间值有无效。有关详细信息,请参阅my answer here。只要系统时间设置正确(无论时区如何)并且您不需要将时间显示为文本或从文本中解析时间,Java就没有问题,其计算也是正确的。如果确实需要显示/解析时间值,则设置默认时区是安全的,并且它不会影响存储时间的方式,当然Java将使用该时区来解析未明确表示的时间文本表示指定时区(就像您在示例中使用SimpleDateFormat一样进行解析,因为格式字符串不包含时区)。

至于为什么Java在你的服务器盒上而不是你的桌面盒上有这个问题,它是什么版本的Windows Server,以及服务器上运行的Java版本是什么?我的猜测是JVM无法明确识别操作系统版本,因此无法确定如何获取本地时区,因此使用UTC作为后备。尝试将您的Java版本更新到最新版本。

另一个可能是服务器上的时区是基于每个用户设置的。验证是否正确设置了在服务器上运行应用程序的用户/进程的时区。

答案 2 :(得分:1)

Oracle上有一个关于该问题的错误:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7044727。基本上是因为Java将时区从注册表中拉出来。 Windows将其保存在HKLocalMachine中,这不是客户端时间,而是机器的时间。

答案 3 :(得分:1)

从2003服务器升级到2008服务器后,我遇到了这个问题。 Java一直使用GMT时区而不是Windows时区设置。解决方案很简单,转到Windows控制面板并更改为不同的时区(无论时区是否正常),然后将其更改回来。花了我几个小时来解决它,但它起到了魅力。

我的想法:这个变化触发了Java中的一些东西,纠正了这个问题。