我有一个非常简单的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
表示区域偏移量(以毫秒为单位),如预期为负 5 小时。
当我将区域偏移设置为 0 时,我希望读取的时间是我的真实本地时间 15:09,但实际读取的是 05:09,换句话说,它又减少了 5 个小时,而不是添加它们.
为什么?我很困惑!最佳答案
我认为您所做的是设置一个日历,其中包含当前时区(-5小时)(10:09)中的当前时间,然后您将获得以毫秒为单位的时间,它会返回毫秒时间,就像您处于格林威治标准时间一样。即增加了 5 小时 (15:09)
System.out.println(New Date(milliseconds)) 解释当前时区的时间(-5 小时)(10:09)
然后,您将区域偏移量更改为零,但保持日期和时间数字不变。 (10:09) 然后,您再次以毫秒为单位计时,这又好像是 GMT(它没有添加任何内容)(10:09)
System.out.println(New Date(time in millis)) 解释当前时区的时间(-5 小时)(05:09)
这里的关键信息是,Date 在内部始终是 GMT,并且仅当您格式化它或调用由 println (...) 方法完成的 toString() 时才应用时区。
calendar.getTimeInMillis () 始终返回自 01/01/1970 UTC(计算机纪元)开始以来的毫秒数
关于java - 尝试理解 Java 中的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29866325/