为什么减去这两次 (1927 年) 给出一个奇怪的结果? | Java Debug 笔记

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

提问:为什么减去这两次 (1927 年) 给出一个奇怪的结果?

如果我运行以下程序,它解析了两个日期字符串引用时间1秒分开,并比较它们:

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000;
    System.out.println(ld4-ld3);
}
复制代码

输出是:

353

为什么不是(正如我期望从时间的一秒差异),但?ld4-ld31353

如果我在1秒后将日期更改为时间:

String str3 = "1927-12-31 23:54:08";  
String str4 = "1927-12-31 23:54:09";  
复制代码

然后是。ld4-ld31

爪哇版本:

java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)
Timezone(`TimeZone.getDefault()`):

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,
useDaylight=false,
transitions=19,
lastRule=null]

Locale(Locale.getDefault()): zh_CN
复制代码

高分回答:

这是 12 月 31 日上海时区的变化。

有关 1927 年在上海的详细信息,请参阅此页面。基本上在1927年底的午夜,时钟回到5分52秒。因此,"1927-12-31 23:54:08"实际上发生了两次,它看起来像Java解析它作为后来可能的瞬间,当地日期/时间 - 因此差异。

只是另一个情节在经常怪异和美妙的时区世界。

编辑:别按了!历史变迁...

原来的问题将不再表现出完全相同的行为,如果重建与版本2013a的TZDB。2013年的结果是358秒,过渡时间为23:54:03,而不是23:54:08。

我只注意到这一点, 因为我在野田时间收集这样的问题, 以单位测试的形式...测试现在已经更改,但它只是显示 - 甚至没有历史数据是安全的。

编辑:历史又变了。。。

在TZDB 2014f中,更改时间已移动到 1900-12-31,现在只需 343 秒更改(因此,如果您明白我的意思,则中间的时间为 344 秒)。tt+1

编辑:要回答关于1900年过渡的问题。。。它看起来像Java时区实现对待所有时区只是在他们的标准时间之前的任何瞬间1900 UTC开始:

import java.util.TimeZone;

public class Test {
    public static void main(String[] args) throws Exception {
        long startOf1900Utc = -2208988800000L;
        for (String id : TimeZone.getAvailableIDs()) {
            TimeZone zone = TimeZone.getTimeZone(id);
            if (zone.getRawOffset() != zone.getOffset(startOf1900Utc - 1)) {
                System.out.println(id);
            }
        }
    }
}
复制代码

上面的代码不会在我的 Windows 计算机上生成输出。因此,任何时区,除了1900年初的标准时区外,任何时区都将算作一个过渡。TZDB 本身有一些数据追溯得更早,并且不依赖于任何"固定"标准时间(假设这是一个有效的概念)的想法,因此其他库不必引入这种人为的过渡

文章翻译自 *.com/questions/6…

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞???? 求关注❤️ 求分享???? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️

上一篇:【力扣笔记54】螺旋矩阵


下一篇:每日leetcode-数组-54. 螺旋矩阵