为什么Java在Windows中选择协调的世界时区时返回GMT-4.5中的日期?

为什么Java在Windows中选择协调的世界时区时返回GMT-4.5中的日期?,java,windows,timezone,utc,Java,Windows,Timezone,Utc,我们在一些Windows XP机器上看到了一个奇怪的问题,涉及“协调世界时”时区。并不是所有的WindowsXP机器都有它,但是在那些有它的机器上,下面是一个简单的Java程序 public class TimeTest { public static void main(String[] args) { System.out.println(java.util.TimeZone.getDefault()); System.out.println(new

我们在一些Windows XP机器上看到了一个奇怪的问题,涉及“协调世界时”时区。并不是所有的WindowsXP机器都有它,但是在那些有它的机器上,下面是一个简单的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="America/Caracas",offset=-16200000,dstSavings=0,useDaylight=false,transitions=5,lastRule=null] Fri Nov 13 05:34:14 VET 2009 sun.util.calendar.ZoneInfo[id=“America/Caracas”,偏移量=-16200000,DSTSaviews=0,useDaylight=false,transitions=5,lastRule=null] 2009年11月13日星期五05:34:14兽医 (即比格林尼治标准时间晚4个半小时)。我应该补充一点,我的总部设在伦敦,从未去过南美洲。:-)

我的问题是:

  • Java从哪里获得这个时区?我以为协调世界时应该是GMT的新名字
  • 为什么有些Windows机器有这个时区,而其他的没有

它使用默认时区打印出来。您的主题谈到了“选择”UTC,但我在您的课程中没有看到任何这样的选择。如果您选择了其他地方,请详细说明具体位置。如果您更改了XP时区,您可能想尝试重新启动—您的Java代码可能从某处获得缓存值

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

如果希望代码使用UTC,则应明确指定。。。最好使用而不是内置的
日期
/
日历

编辑:如果您在同一台机器上安装了.NET 3.5,请尝试这个小程序,看看它认为时区是什么:

using System;

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

我在Unix/Solaris中遇到了同样的问题。date命令在出现类似“date-u 042315232010”的命令时使用Time/Zome变量。如果使用参数-u,comand date将使用一个名为TZ的变量,它将根据TZ中的参数调整GMT时间。要解决这些问题,请使用comand“日期042315232010”和所有已工作的。也许您应该在Java程序中避免使用时区语句。顺便说一句,“日期042315232010”的意思是“2010年4月23日星期五15:23:00 VET”。

我体验过爪哇看到了委内瑞拉标准时间(VET)的时区,即使窗口设置为太平洋。这是在一个新克隆的VMWare盒子上。一旦我将时区从Pacific更改为其他时区,保存它,再将其更改回Pacific,保存它,然后重新启动Java应用程序,Java就会识别出正确的时区。

通过“选择”,我的意思是在控制面板/日期和时间/时区中选择它,而不是通过编程进行设置。当我在控制面板中将其更改为其他值时,Java似乎改变了其默认时区的概念,但对于这个值,它似乎荒谬地关闭了。好吧,在这种情况下,这很奇怪。所有机器(工作+不工作)都使用相同版本的Java吗?我只发现两台Windows XP机器的控制面板上有UTC时区。两者都使用1.6.0_06。在1.5.0_12上运行相同的代码会产生不同的奇数时区!(ACT=美国/ RioObBrango,GMT-05),而且重新启动没有区别。考虑使用[ java时区更新] [1 ]工具。我猜Java处理时区的方式与操作系统不同。[1] :另见