• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

程序员1927年12月31日午夜一秒谜案

相关文章 程序员 7年前 (2018-03-28) 204次浏览 已收录 0个评论

问题描述

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

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将这个时间解析为之后的那个瞬间。 因此出现了这种差别。同理可测试美国时间就没有这个问题。

简单理解就是,因为标准时间改了,在JAVA心中,它认为1927/12/31的23:54:08就是1928/1/1的00:00:00。它只是按照它认为的”标准时间”,忠实的执行了计算。这只是美好但奇怪的世界时区中的一个插曲。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:程序员1927年12月31日午夜一秒谜案

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址