搜索 社区服务 统计排行 帮助
  • 1473阅读
  • 8回复

在cnBeta看到Freewind君引发的一场讨论

楼层直达
级别: 圣骑士
注册时间:
2005-01-13
在线时间:
183小时
发帖:
224
— 本帖被 sakuraahn 执行锁定操作(2012-07-07) —
引用

http://www.cnbeta.com/articles/151499.htm
新闻来源:煎蛋
虽说是程序员问的,不过内容和编程本身其实并没什么太大关系,请各位听我细细道来。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日发生了变化。
请看这里 。(网页截图如下)



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

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

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


看完我只想说程序员不是全知全能的,怎么可能知道爷爷的爷爷那时发生的事情呢
级别: 光明使者
注册时间:
2002-10-27
在线时间:
512小时
发帖:
13126
只看该作者 1楼 发表于: 2011-08-12
大学和研究生学得扎实吧。毕竟都是搞研究的。

知行合一
级别: 天使
注册时间:
2008-07-11
在线时间:
1834小时
发帖:
27139
只看该作者 2楼 发表于: 2011-08-12
还以为自由风又…
级别: 天使
注册时间:
2006-06-15
在线时间:
1228小时
发帖:
40788
只看该作者 3楼 发表于: 2011-08-12
LZ这标题是没错,但是在这个论坛就有点那啥..

级别: 天使
注册时间:
2008-07-11
在线时间:
1834小时
发帖:
27139
只看该作者 4楼 发表于: 2011-08-12
引用
引用第3楼konpal于2011-08-12 20:03发表的  :
LZ这标题是没错,但是在这个论坛就有点那啥..

我好像转过PPG的新闻
级别: 光明使者
注册时间:
2008-09-13
在线时间:
492小时
发帖:
8736
只看该作者 5楼 发表于: 2011-08-13
那调表的人是谁.....


想必上帝一定很爱他们
级别: 侠客
注册时间:
2008-05-11
在线时间:
40小时
发帖:
319
只看该作者 6楼 发表于: 2011-08-13
还以为在说自由风又怎么了

级别: 风云使者
注册时间:
2003-02-21
在线时间:
565小时
发帖:
2104
只看该作者 7楼 发表于: 2011-08-13
根本没有人知道吧,程序居然能够这样自动修正?
出BUG都没有办法知道。
级别: 风云使者
注册时间:
2006-01-02
在线时间:
192小时
发帖:
2211
只看该作者 8楼 发表于: 2011-08-13
这是个好捏他,以后可以制作一个时空跳跃的故事。

话说,这JAVA如何得知1927年12月31日上海时钟倒播的事?程序原代码里应该没可能记入那么多的时间调整信息的,只可能是外来信息源的输入才会这样吧。

果然是需要IBM5100么?