java - 尝试理解 Java 中的时区

标签 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 表示区域偏移量(以毫秒为单位),如预期为负 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/

相关文章:

java - 日期时间值如何存储在 mysql 中?

swift - 两个 dateTimes 之间的差异(以秒为单位)因时区不同而异 - Swift 3

java - Android 谷歌分析 EasyTracker

java - 多个日期条目之间的锻炼间隙

java - 处理来自 Throwable catch 的 NullPointerException 的最佳方法? (安卓)

excel - 如何在 Excel 中选择区域中的最后一个单元格

php - 从 timezone_identifier -php 中检索语言环境

Java:getTimeZone 不返回默认值

java - 从 HttpResponse 获取 json

java - 为什么JavaCC显示错误