Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解Java中的时区_Java_Date_Timezone_Timezone Offset - Fatal编程技术网

试图理解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

我有一个非常简单的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
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的偏移量为零。这仍然没有意义。