试图了解Java中的时区

时间:2015-04-25 14:18:27

标签: java date timezone timezone-offset

我有一个非常简单的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()));
}

我的家乡时区是GMT。为了我的实验,我将计算机的时区设置为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表示以ms为单位的区域偏移量,按预期为负5小时。

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

为什么呢?我很困惑!

2 个答案:

答案 0 :(得分:1)

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

System.out.println(新日期(毫秒))解释当前时区(-5小时)(10:09)的时间

然后将区域偏移更改为零,但保持日期和时间数字不变。 (10:09)然后你又花了几毫秒的时间再次就好像它是格林尼治标准时间(它什么也没有增加)(10:09)

System.out.println(新日期(毫秒时间))解释当前时区(-5小时)(05:09)的时间

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

calendar.getTimeInMillis()始终返回自01/01/1970 UTC(计算机纪元)开始以来的毫秒数

答案 1 :(得分:0)

Java使用计算机的时区,即EDT。将Calendar.ZONE_OFFSET设置为' 0'然后它会给你当前的EDT时间。如果您需要获取当前时间,则需要设置与EDT相关的Calendar.ZONE_OFFSET,即5小时(+ 18000000ms)。

<强> [UPDATE] 时区偏移设置为&#39; 0&#39;意味着宣布我在GMT并且系统时间是GMT。 但是你需要记住,你仍然在原始位置-18000000。 计算时,请选择正确的位置-1800000,然后提前5小时调整。

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

认为您可以立即前往世界的任何地方。 您将在纽约(EST)的时间设置为10:00。 现在你去格林威治(格林威治标准时间),你说我的时间是10点。 (将时区偏移设置为&#39; 0&#39;) 然后你来纽约(美国东部时间)打印你的时间,认为10点是格林威治(格林威治标准时间)05:00的时间。