@ 2011.07.30 , 19:49
77

[程序员段子] 1927年12月31日午夜一秒谜案

via StackOverflow

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

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

我在用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呢?

面对这一诡异的问题,网友们很快追问,“你的区域(Locale)设置是什么?这可能是个区域问题/和当地夏令时之类的东西有关。”

楼主很快附上了Java版本号和区域设置:

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

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

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

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

请看这里。(网页截图如下)
[-]
(1928年1月1日0点0分,当地时间由地方平时(Local Mean Time)改为北京时间/中国标准时间)

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

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

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


给这篇稿打赏,让译者更有动力
支付宝打赏 [x]
您的大名: 打赏金额:

4.7
赞一个 (4)

TOTAL COMMENTS: 77+1

[2] 1 »
  1. 2090448

    略过正文直奔回复

  2. 1340165

    @Freewind: 貌似是实行夏令时。

  3. 1327675

    喂喂。。Freewind本人已经来煎蛋辟谣了。。这帖子怎么就木有人理了捏?

  4. Freewind
    @7 years ago
    865494

    其实这个问题不是我自己发现的,而是在一个群里看到有人提出,无人能答,我便把它发到stackoverflow上了,没想到神人Jon Skeet马上就回答出来了。

    后来搜索了一下,发现在最早在百度知道里提出:http://zhidao.baidu.com/question/296267306.html

    另外,不只是1927那一年,后来也调整过多次,最近的一次是1991年。

    参见:
    http://www.timeanddate.com/worldclock/clockchange.html?n=237&year=1991

  5. 851756

    @ZHX: 至少在Windows上,Java只是简单地映射了Windows提供的时区。所以,你可能应该夸Windows。

  6. 849529

    .net 确实没有这个问题

  7. 849278

    呃,半路出家的人感觉压力好大……

  8. Boler Guo
    @7 years ago
    849028

    我用.net 怎么没办法重现这个问题?

  9. 848894

    Java函数库里居然连这种东西都有。。。。
    这库都神人编的啊。。。

  10. wubotao
    @7 years ago
    848677

    不过我很奇怪为什么北京的地方时会比东经120°标准时要快,按道理要慢才对啊。。。

  11. wubotao
    @7 years ago
    848671

    维基百科上说:民国17年(1928年),国民政府统一中国,原中央观象台的业务由南京政府中央研究院的天文研究所和气象研究所分别接收。天文研究所编写的历书基本上沿袭中央观象台的做法,仍将全国划分为5个标准时区,只是在有关交气、合朔、太阳出没时刻等处,不再使用北平的地方平时,而改以南京所在的标准时区的区时即东经120°标准时替代。(http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9C%8B%E6%99%82%E5%8D%80)
    按此理解:在1928年1月1日之前,中国东部使用的是北京的地方时间,之后使用的是东经120°标准时。而北京的地方时比东经120°的标准时快5分52秒。

  12. haitao
    @7 years ago
    848658

    时区的选择,应该按经度加减就行了吧。
    像本例,运行环境自动把时区与行政关联,应该是狗拿耗子了
    应用如果真的与行政关联,应该是应用开发者自己要关心、考虑、增减的

  13. 阿 牛
    @7 years ago
    848536

    那天发生了什么事情?为什么要回拨时间?

  14. blueidoo
    @7 years ago
    848425

    其实很多程序员在工作以后都会了解一些其它行业的知识,
    比如我们给一个做国际贸易的公司做办公系统,目前他们公司有的人已经开始向我们询问业务问题了。

  15. ggarlic
    @7 years ago
    848067

    不一定是魔都的,中国大陆的locale一般给三个地址:Chongqing Shanghai Beijing,我每次装系统反正都是随便挑的

  16. Harviu
    @7 years ago
    848057

    既然23:54:08发生了两次,为什么比较的是后面那次,而不是前面的?

  17. 848030

    忠于值守的java。

  18. 木木大人
    @7 years ago
    847951

    偶们这种程序白痴情何以堪

  19. 真的金龙
    @7 years ago
    847907

    问题是这仅仅是认为而已,Java怎么会记得始终拨回了5分钟的,它应该只记得按部就班的一分一秒的过下去才对啊

  20. nasitehe
    @7 years ago
    847892

    偏。。

  21. 春雨后的蟹
    @7 years ago
    847858

    @neverland:
    算起来中国也要加个西安时间什么的吧,就北京时间和乌鲁木齐时间两个时间。。。。话中国横跨几个时区的说。

  22. 大石之东
    @7 years ago
    847830

    只是某些掌握了it话语权的家伙系统设置的问题而已

  23. 847829

    Stack Overflow 太牛了

  24. 饼子
    @7 years ago
    847783

    啊…………也就是说 在那之前,上海用的是上海时间咯?

  25. Snokye
    @7 years ago
    847742

    @elf: 我更想知道他是怎么发现这个”Bug”的, 测试?

  26. neverland
    @7 years ago
    847737

    我觉得,我们对时区问题的反应没有米国佬那么迅速,和他们习惯了一个国家分成n个时区加上使用夏时制有关

  27. PassBy
    @7 years ago
    847723

    如果做的是养老金管理系统,是有可能遇到这样的问题。

[2] 1 »

发表评论


24H最赞