5

我们在一些涉及“协调世界时”时区的 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="America/Caracas",offset=-16200000,dstSavings=0,useDaylight=false,transitions=5,lastRule=null]
2009 年 11 月 13 日星期五 05:34:14 VET

(即比格林威治标准时间晚 4 个半小时)。我应该补充一点,我在伦敦,从未去过南美。:-)

我的问题是:

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

3 回答 3

3

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

于 2012-09-06T22:18:17.103 回答
0

我在 Unix/Solaris 中遇到了同样的问题。当像“date -u 042315232010”这样的命令时,date 命令使用 Time/Zome 变量。如果您使用参数 -u 命令日期使用名为 TZ 的变量,它会根据 TZ 中的时间调整 GMT 时间。要解决这些问题,请使用命令“日期 042315232010”,一切正常。也许您应该在 Java 程序中避免使用 TimeZone 语句。顺便说一句,“日期 042315232010”的意思是“Fri Apr 23 15:23:00 VET 2010”。

于 2010-04-23T20:10:07.993 回答
0

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

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

如果您希望您的代码使用 UTC,则应明确指定...最好使用Joda Time而不是内置Date/Calendar类。

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

using System;

class Test
{
    static void Main()
    {
        Console.WriteLine(TimeZoneInfo.Local.DisplayName);
    }
}
于 2009-11-13T09:57:49.687 回答