java - 为什么相减这两个时间(1927年)会得到奇怪的结果

标签 IT工具网 java

问题描述

如果我运行如下的程序,将两个相距一秒的日期解析成字符串并比较他们。

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-ld3不是1(正如我所期望的那样),而是353?

如果我把时间改变为之后的一秒:

String str3 = "1927-12-31 23:54:08";  
String str4 = "1927-12-31 23:54:09"; 

这时,ld4-ld3的结果为1.

java版本:

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)

时区:

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

Locale(Locale.getDefault()): zh_CN

问题回答

这是因为1927年11月31日上海的时区改变了。 观看此页获得更多关于上海1927年的细节。 这个问题主要是由于在1927年12月31日的午夜,时钟回调了5分钟零52秒。 所以”1927-12-31 23:54:08”这个时间实际上发生了两次,看上去java将这个时间解析为之后的那个瞬间。 因此出现了这种差别。

这只是美好但奇怪的世界时区中的一个插曲。

stackoverflow链接:Why is subtracting these two times (in 1927) giving a strange result?

相关文章:

JavaScript中对象属性的定义

JavaScript的.prototype是如何工作的

java如何计算MD5值

java - JavaFX 和 Apple M1(硅)芯片和 Intellij 出现问题,错误 : Loading library prism_es2 from resource failed and (mach-o file, 需要 'arm64e' ))

java - HSM 错误 |私钥必须是 RSAPrivate(Crt)Key 的实例或具有 PKCS#8

java - 我必须拆分数组数据,使其成为键值对并保存在 map 中

java - Tomcat context.xml 中的多个 DB 连接?

@Component, @Repository, @Service的区别

Nginx反向代理自建CDN加速节点实现DNS智能解析

java - 如何确保Java在某些代码块中不会切换线程?