3

如果在 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

4 回答 4

3

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

-Duser.timezone="YOUR_TIME_ZONE_HERE"

通过代码。您也可以尝试使用 Oracle 的时区更新工具

要查看 Java 使用的时区:

System.out.println(TimeZone.getDefault());
于 2013-04-30T14:37:24.150 回答
2

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

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

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

于 2013-04-30T16:29:27.960 回答
1

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

于 2014-01-20T14:04:08.527 回答
1

从 2003 服务器升级到 2008 服务器后,我遇到了这个问题。Java 一直使用 GMT 时区而不是 Windows 时区设置。解决方法很简单,转到 Windows 控制面板并更改为不同的时区(任何时区都可以),然后将其更改回来。我花了几个小时才弄明白,但它很有魅力。

我的想法:更改触发了 Java 中的某些内容,从而纠正了问题。

于 2015-12-11T01:08:08.327 回答