试图理解Java中的时区
我有一个非常简单的Java程序,如下所示:试图理解Java中的时区,java,date,timezone,timezone-offset,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
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
2015年4月25日10:09:23美国东部夏令时(美国东部夏令时)
如预期的那样指示系统时间和时区
-18000000
表示区域偏移量,单位为毫秒,如预期的负5小时
当我将区域偏移量设置为0时,我希望读取我的实际本地时间15:09,但它读取的是05:09,换句话说,它又减少了5个小时,而不是添加它们
为什么??我糊涂了 Java采用计算机的时区,即EDT。当您将Calendar.ZONE\u偏移设置为“0”时,它将为您提供当前的EDT时间。如果需要获取当前时间,则需要设置与EDT相关的Calendar.ZONE_偏移量,即5小时(+18000000ms) [更新] 时区偏移设置为“0”表示声明我在GMT,系统时间为GMT。 但是你需要记住,你仍然在你原来的位置,那就是-18000000。 当您计算时,您选择了正确的位置,即-1800000,然后提前5小时进行调整 让我用一个例子来解释你做了什么 我想你可以在短时间内到达世界的任何地方。 你把你在纽约的时间定在10:00。 现在你去格林威治,你说我的时间是10点。(将时区偏移设置为“0”)
然后你来到纽约(美国东部时间)打印你的时间,认为10:00是格林威治时间(格林威治标准时间)的时间,也就是05:00。我认为你所做的是在当前时区(-5小时)(10:09)中设置一个日历然后得到以毫秒为单位的时间,它返回毫秒时间,就好像你是以格林尼治标准时间为单位的。即它加上5小时(15:09) System.out.println(新日期(毫秒))解释当前时区中的时间(-5小时)(10:09) 然后将分区偏移更改为零,但保持日期和时间数字不变。(10:09)然后再次以毫秒为单位计算时间,这又好像是格林尼治标准时间(不加任何内容)(10:09) System.out.println(新日期(时间单位为毫秒))解释当前时区中的时间(-5小时)(05:09) 这里的关键信息是,日期在内部始终为GMT,只有在格式化日期或调用由println(…)方法完成的toString()时,才会应用时区
calendar.getTimeInMillis()始终返回自1970年1月1日UTC(计算机纪元)开始以来的毫秒数,但EDT的偏移量为-5小时,这是正确报告的。GMT的偏移量为零。这仍然没有意义。