Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2011-09-22) 1927年12月31日午夜一秒谜案

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

我在stackoverflow上问了一个关于Java中时间的问题,居然火了那么一下下。其实那个问题也不是我自己发现的,而是在一个Java群中有人提了,但没人知道怎么回事,所以我便到stackoverflow上问了一下而已。

后来发现网上有人写了一个段子,报道了这件事,大意是程序员伤不起,不但要会写程序,还得上知天文下知地理。同一件事情,别人的语言写得非常生动幽默,值得好好学习。

文章见:http://jandan.net/2011/07/30/1927-java-time.html


内容如下:

虽说是程序员向,不过内容和编程本身其实并没什么太大关系,请各位听我细细道来。

StackOverflow是一个程序员向的问答网站,广大程序员们在上面交流经验、提问答疑,三天前,一位名叫Freewind的用户发布了下面这个问题

If I run the following program, which parses two date strings referencing times one second apart and compares them:

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(ld3);  
    System.out.println(ld4);  
    System.out.println(ld4-ld3);
} 


The output is:
````
-1325491905
-1325491552
353

<p>Why is `ld4-ld3` not `1` (as I would expect from the one-second difference in the times), but `353`? 

If I change the dates to times a second later:
````String str3 = "1927-12-31 23:54:08";&nbsp; 
String str4 = "1927-12-31 23:54:09";&nbsp; 

Then ld4-ld3 will be 1

翻译过来即是:

我在用Java编写一段比较两个字符串时间间隔的程序,然而当我比较“1927-12-31 23:54:07”和“1927-12-31 23:54:08”这两个时间时,输出结果却不是1……而是353。

 

当我把两个时间分别往后调整1秒,变成“1927-12-31 23:54:08”和“1927-12-31 23:54:09”,结果就又是1了!——可为什么那两个时间的结果,却是353呢?

(……没错,Freewind君,似乎是一位魔都死程。不知道这里有没有人认识这位老兄?)

在这份追加信息出现仅仅两分钟之后,StackOverflow站上的问答狂人Jon Skeet给出了如下答复——

这是因为上海的时区在12月31日发生了变化。

请看这里。(网页截图如下)

image

(1928年1月1日0点0分,当地时间由地方平时(Local Mean Time)改为北京时间/中国标准时间)

简单地说,在1927年末的最后那一个午夜,时钟被往回拨了5分52秒。所以“1927-12-31 23:54:08”这一秒,事实上,发生了两次,而看起来在计算当地时间时,Java将其视为了后面那一个时间点,于是就产生了这一差别。

这正是时区世界的奇妙与不可思议啊。

在StackFlow网民们纷纷膜拜Jon Skeet的神速之时,其他程序员也以测试的方式验证了这一结果的正确——美国时间木有这个问题。看来,当一枚程序员,有时真的需要上通天文、下知地理啊……

comments powered by Disqus