为什么在Windows中select协调世界时时区时,Java在GMT-4.5中返回一个date?

在一些涉及“协调世界时”时区Windows XP机器上,我们看到了一个奇怪的问题。 并不是所有的Windows XP计算机似乎都有它,但在那些做的,下面的简单的Java程序

public class TimeTest { public static void main(String[] args) { System.out.println(java.util.TimeZone.getDefault()); System.out.println(new java.util.Date()); } } 

在JDK 1.6.0_06上打印:

 sun.util.calendar.ZoneInfo [ID = “美国/加拉加斯”,偏移= -16200000,dstSavings = 0,useDaylight =假,过渡= 5,lastRule =空]
星期五11月13日05:34:14 VET 2009

(即格林威治时间4个半小时)。 我应该补充说我在伦敦,而且从未去过南美。 🙂

我的问题是:

  • Java从哪里得到这个时区? 我认为协调世界时间应该是格林尼治标准时间的新名称。
  • 为什么有些Windows机器有这个时区而不是其他的?

尽管Windows被设置为太平洋地区,但是我经历了Java观看委内瑞拉标准时间(VET)的时区。 这是在一个新克隆的VMWare盒子上。 一旦我将时区从太平洋改为其他地方,保存它,把它改回太平洋,保存它,然后重新启动我的Java应用程序,Java就识别出正确的时区。

它使用默认的时区打印出来。 你的主题谈到“选择”UTC,但我没有看到你的程序中有这样的选择。 如果您在其他地方选择了它,请详细说明在哪里。 如果您更改了XP时区,则可能需要尝试重新启动 – Java代码可能从某处获取缓存值。

打印出java.util.TimeZone.getDefault ,我怀疑你会在有问题的机器上看到VET。

如果你想要你的代码使用UTC,你应该明确指定…最好使用Joda时间,而不是内置的Date / Calendar类。

编辑:如果你有相同的机器上的.NET 3.5,试试这个小程序,看看认为时区是什么:

 using System; class Test { static void Main() { Console.WriteLine(TimeZoneInfo.Local.DisplayName); } } 

我在Unix / Solaris中遇到了同样的问题。 日期命令使用时间/ Zome变量时,这些“日期-u 042315232010”的指令。 如果使用参数-u命令日期使用一个名为TZ的变量,并且它会对TZ中的那些进行相应的GMT时间调整。 为了解决这些使用命令“日期042315232010”,一切工作。 也许你应该避免在Java程序中使用TimeZone语句。 顺便说一下,“日期042315232010”的意思是“5月23日15:23:00 VET 2010”。