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

发布于 2024-08-10 16:49:13 字数 672 浏览 12 评论 0原文

我们在某些 Windows XP 计算机上发现了涉及“协调世界时”时区的奇怪问题。并非所有 Windows XP 机器似乎都有它,但在那些有的机器上,

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 上的以下简单 Java 程序会打印:(

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

即比 GMT 晚 4 个半小时)。我应该补充一点,我住在伦敦,从未去过南美洲。 :-)

我的问题是:

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

We have seen a strange issue on some Windows XP machines involving the "Co-ordinated Universal Time" time zone. Not all Windows XP machines seem to have it, but on those that do, the following simple Java program

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

on JDK 1.6.0_06 prints:

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

(i.e. 4 and a half hours behind GMT). I should add that I am based in London, and have never been to South America. :-)

My questions are:

  • Where does Java get this time zone from? I thought Co-ordinated Universal Time was supposed to be the new name for GMT.
  • Why do some Windows machines have this time zone but not others?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鹿港巷口少年归 2024-08-17 16:49:13

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

I experienced Java seeing a time zone of Venezuelan Standard Time (VET) even though Windows was set for Pacific. This was on a newly cloned VMWare box. Once I changed the time zone from Pacific to something else, saved it, changed it back to Pacific, saved it, then restarted my Java application, Java then recognized the correct time zone.

∞觅青森が 2024-08-17 16:49:13

它使用默认时区打印它。您的主题谈到“选择”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);
    }
}

It's printing out it using the default time zone. Your subject talks about "choosing" UTC, but I don't see any such choice in your program. If you've chosen it somewhere else, please give details of exactly where. If you've changed the XP time zone, you may want to try rebooting - it's possible that your Java code is getting a cached value from somewhere.

Print out java.util.TimeZone.getDefault and I suspect you'll see VET on the machines with the problem.

If you want your code to use UTC, you should specify that explicitly... preferably using Joda Time instead of the built-in Date/Calendar classes.

EDIT: If you have .NET 3.5 on the same machines, try this little program to see what it thinks the time zone is:

using System;

class Test
{
    static void Main()
    {
        Console.WriteLine(TimeZoneInfo.Local.DisplayName);
    }
}
萌辣 2024-08-17 16:49:13

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

I got the same problem in a Unix/Solaris. The date command use a Time/Zome variable when a comand like these "date -u 042315232010". If you use the parameter -u the comand date use a variable named TZ and it proced to ajust the GMT time against those in TZ. To solve these use the comand "date 042315232010" and all worked. Perhaps you should avoid TimeZone sentences in your Java program. By the way "date 042315232010" means "Fri Apr 23 15:23:00 VET 2010".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文