编程语言
首页 > 编程语言> > 带有DST的Java时区显示错误的时间(负历元)

带有DST的Java时区显示错误的时间(负历元)

作者:互联网

我很难理解以下代码的行为:

    TimeZone zone = TimeZone.getTimeZone("Asia/Jerusalem");
    DateFormat format = DateFormat.getDateTimeInstance();
    format.setTimeZone(zone);

    //printing out 4 different epoch dates

    //print out using formatter with TZ
    System.out.println(format.format(new Date(-1712458800000L))); 
    //print using Date's toString method
    System.out.println(new Date(-1712458800000L)); 

    System.out.println(format.format(new Date(-57844760000L)));
    System.out.println(new Date(-57844760000L));

    System.out.println(format.format(new Date(-1888228760000L)));
    System.out.println(new Date(-1888228760000L));

    System.out.println(format.format(new Date(1456920000000L)));
    System.out.println(new Date(1456920000000L));

在我的本地计算机(时区GMT 2耶路撒冷)上运行时,在Windows中选中了“自动调整DST的时钟”(这使我成为GMT 3)
它产生以下输出:

Sep 26, 1915 11:20:40 PM
Sun Sep 26 23:20:40 IST 1915

Mar 2, 1968 2:00:40 PM
Sat Mar 02 14:00:40 IST 1968

Mar 2, 1910 2:21:20 PM
Wed Mar 02 14:21:20 IST 1910

Mar 2, 2016 2:00:00 PM
Wed Mar 02 14:00:00 IST 2016

但是当我取消选中它(使我成为GMT 2)时,运行相同的代码会产生

Sep 26, 1915 11:20:40 PM
Sun Sep 26 23:00:00 GMT+02:00 1915

Mar 2, 1968 2:00:40 PM
Sat Mar 02 14:00:40 GMT+02:00 1968

Mar 2, 1910 2:21:20 PM
Wed Mar 02 14:00:40 GMT+02:00 1910

Mar 2, 2016 2:00:00 PM
Wed Mar 02 14:00:00 GMT+02:00 2016

第一个和第三个示例在使用Date的toString()时的分钟和秒上有所不同.
如您所见,当我使用DateFormat显式设置TZ时,它会输出相同的结果.
我在这里想念什么?

谢谢!

解决方法:

让我们看一下您1915年的例子.作为millis-since-the-unix-epoch的值-1712458800000是1915-09-26T21:00:00Z-换句话说,正好是UTC的晚上9点.

现在回到1915年,耶路撒冷的UTC偏移量是2:20:40,这就是为什么在输出的第一行看到“ 1915年9月26日晚上11:20:40”的原因.但是,当您在Windows中关闭DST时,Windows或Java都将其说为“将此作为UTC 2的固定时区处理”.这不是真正的“在没有DST更改的情况下将其作为耶路撒冷,而在其他方面进行更改.”因此,您在第二行中看到的是UTC 2的值,即“ Sun Sep 26 23:00:00 GMT 02:00 1915”.

基本上,“没有DST的时区”的概念很奇怪,并且已经简化(同样,我不确定是Windows还是Java)到固定的偏移量.当“标准”偏移量不变时,这很好,但是当它偏移时会引起类似的问题.在相当现代的历史中,大多数时区都没有改变其标准偏移量,但是在20世纪初期,有很多变化.

标签:timezone-offset,timezone,java
来源: https://codeday.me/bug/20191118/2031264.html