【问题标题】:Trying to understand timezones in Java试图理解 Java 中的时区
【发布时间】:2015-04-25 14:18:27
【问题描述】:

我有一个非常简单的Java程序如下:

public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    System.out.println(new Date(cal.getTimeInMillis()));
    System.out.println(cal.get(Calendar.ZONE_OFFSET));
    cal.set(Calendar.ZONE_OFFSET, 0);
    System.out.println(new Date(cal.getTimeInMillis()));
}

我的家乡时区是格林威治标准时间。出于实验的目的,我将计算机的时区设置为 EDT,并观察到系统时钟已向后移动 5 小时。

当我运行程序时,我得到这个输出:

Sat Apr 25 10:09:23 EDT 2015
-18000000
Sat Apr 25 05:09:23 EDT 2015

Sat Apr 25 10:09:23 EDT 2015 表示系统时间和时区,正如预期的那样。

-18000000 表示区域偏移量,单位为毫秒,如预期的那样为负 5 小时。

当我将区域偏移设置为 0 时,我希望时间读取我的实际本地时间 15:09,但它读取的是 05:09,换句话说,它已经花费了另外 5 个小时而不是添加它们.

为什么?我很困惑!

【问题讨论】:

    标签: java date timezone timezone-offset


    【解决方案1】:

    我认为您所做的是将当前时间设置为当前时区(-5 小时)(10:09)的日历,然后您以毫秒为单位返回毫秒时间,就像您在 GMT 中一样。即增加 5 小时 (15:09)

    System.out.println(New Date(milliseconds)) 解释当前时区中的时间(-5 小时)(10:09)

    然后您将区域偏移更改为零,但保持日期和时间数字不变。 (10:09) 然后您再次以毫秒为单位计算时间,这又好像是格林威治标准时间(它什么也没增加)(10:09)

    System.out.println(New Date(time in millis)) 解释当前时区中的时间(-5 小时)(05:09)

    这里的关键信息是 Date 在内部始终是 GMT 并且时区仅在您对其进行格式化或调用由 println (...) 方法完成的 toString() 时应用。

    calendar.getTimeInMillis() 总是返回自 1970 年 1 月 1 日 UTC(计算机纪元)开始以来的毫秒数

    【讨论】:

      【解决方案2】:

      Java 采用您计算机的时区,即 EDT。当您将 Calendar.ZONE_OFFSET 设置为“0”时,它将为您提供当前的 EDT 时间。如果您需要获取当前时间,则需要设置与 EDT 相关的 Calendar.ZONE_OFFSET,即 5 小时(+18000000ms)。

      [更新] 时区偏移设置为“0”意味着声明我在 GMT 并且系统时间是 GMT。 但是您需要记住,您仍然在原来的位置,即 -18000000。 当您计算时,您选择正确的位置,即 -1800000,然后提前 5 小时调整。

      让我用一个例子来解释一下你做了什么。

      认为您可以立即前往世界任何地方。 您将纽约 (EST) 的时间设置为 10:00。 现在你去格林威治(格林威治标准时间),你说我的时间是 10:00。 (将时区偏移设置为“0”) 然后您来到纽约 (EST) 并打印您的时间,认为 10:00 是格林威治 (GMT) 的时间,即 05:00。

      【讨论】:

      • 但 EDT 的偏移量为 -5 小时,并且报告正确。 GMT 的偏移量为零。这仍然没有意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2012-08-14
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多