你确信你了解时间吗?

标签: 杂项资源 轶事趣闻 Java Programmer StackOverflow | 发表时间:2011-08-01 08:25 | 作者:陈皓 Amom
出处:http://coolshell.cn

你还记得“软件真的好难做”中的那个有意思的例子吗?那个例子告诉我们软件开发中假设可能会是致命的事。今天,我又在StackOverflow上看到一个关于时间的问题——为什么1927年12月31日的午夜时间这么奇怪?提问题的这个人给了下面的一段java代码(我做一些修改,保证让你可以copy过去就可以编译运行)

我在其中高亮了几行,这个程序就是想比较一下“1927-12-31 23:54:07”  和  “1927-12-31 23:54:08” 差几秒,很明显,是差一秒。但是程序的输出却不是这样的。

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone; 
class time{
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sf.setTimeZone(TimeZone.getTimeZone("Asia/shanghai"));
        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);
    }
}

下面,让我们来看看程序的输出:(是的,差出353秒钟来)

-1325491905
-1325491552
353

Stackoverflow真的很强大,在大家要求发问者给出时区(中国上海)的15分钟内就解决了这个问题。相当的令人惊叹。原因是什么呢?大家需要围观一下这个网页。(为了怕被墙或是被和谐,我已习惯了抓屏保存,如果有人能开发一个软件能随看随抓,然后如果源被删了可以P2P的从已下载了的人那里获取,那么这个软件应该会很有国内市场。蛋扯远了,Sorry)

从上图中我们可以看到—— 在1927年12月31日23:59:59时,往后面的一秒应该是1928年1月1日 0:0:0,但是这个时间被往后调整了5分52秒,而成了,1927年12月31日的,23:54:08,于是,完成了352秒的穿越。于是我们的Java程序出了这样的一个问题,这真是一个奇迹。

为什么会有这个调整呢?我居然Google不到,不过,我在这个timeanddate.com上查看了一下北京的时间,发现北京的时间只到1970年,于是我猜想,中国近代历史乱七八糟的政权交替可能是这个原因。于是我看 了一下北京和上海物理时差,果然,北京上海的时差在5分50秒左右。因此,我觉得这个时间的变化应该是从上海时间变成了北京时间。至于你信不信,反正我是信了。

从这个事,我得到下面的一些启示:

  1. Java在的时区实现相当的强大啊。这种细节都能考虑到。
  2. 本地时间的完全就是一锅,应该尽量不用。
  3. 如果你要开发和时区有关系的程序,你的系统里一定要使用GMT标准时间,仅在显示的时候才转成本地时间。
各位无证程序员们,看到这个例子,你们是不是感到编程的压力了?呵呵。

相关文章

相关 [时间] 推荐:

暗时间

- myartings - 微软亚洲研究院
刘未鹏,Mindhacks帮主,在这块自留地上笔耕不辍了八年. 他从2003年在《程序员》杂志上发表第一篇技术文章,并开始在CSDN写技术博客. 起初的博客较短,也较琐碎,并夹杂着一些翻译的文章,后来才慢慢开始有了一些自己的心得和看法. 八年来,虽然平均每个月写1篇或者更少,但他从未停止. 写博客这件事情,给他带来的最大体会就是,一件事情如果你能够坚持做8年,那么不管效率和频率多低,最终总能取得一些很可观的收益.

时间与空间

- 马都 - 博客李淼
(《Vision》文章,勿转). 时间与空间这两个概念是物理学的基石,也是我们人类甚至动物依靠直觉就具备的概念. 我们判断一个物体的位置,我们从一个地点走到另一个地点,涉及到空间这个概念. 在小学,我们就开始学习一些简单的几何概念,例如三角形,三角形中的三个角有锐角、钝角和直角. 到了中学,我们还学一点立体几何和解析几何.

linux时间同步

- - BlogJava-首页技术区
第一步的意思是设置时间,设置完了可以用date命令查看对不对...注意是月日时分年  . 第二步的意思是写入主板的rtc芯片..  . su -c 'date -s 月/日/年'  . su -c 'date -s 时:分:秒'  . 由于Linux时钟和Windows时钟从概念的分类、使用到设置都有很大的不同,所以,搞清楚Linux时钟的工作方式与设置操作,不仅对于Linux初学者有着重大意义,而且对于使用Linux服务器的用户来说尤为重要.

编程时间分配图

- Greyby - 酷壳 - CoolShell.cn
下面是一个程序员coding的时间分配图,原图在这里. 思考会是一个很重要的过程,当然耽搁拖沓也有可能也是因为没有想好,抽烟/喝咖啡应该也是一种思考,吃点东西是为了让脑子转得更快一点,上网搜索一下灵感可以借鉴一下其它人的想法,抱怨写注释只是一个例子,更多的应该是抱怨加班或是公司的老板. 如果需要加上点什么的话,我觉得应该加点“重构”,“编译”,“调试”,当然,他们都可以算在coding里.

我的番茄时间

- Dynamic - GTD Life
两天前(5月15日),我们在西安组织了第四期的时间管理沙龙,渡过了一个完美的下午,直到现在还在回味杜蕾的十五分钟短讲呢,呵呵,郭军峰也从心理学的角度分析了“为什么有的时候三个月完成不了的事情,能够在3天内完成”,最后我们还一起列出了“时间管理沙龙荐书单”,大家在分享中收获,在收获中分享,这种感觉还真的是很棒.

细节时间黑洞

- Demi - 最新文章 - UCD大社区
在最早的时候产品设计大多采用瀑布模型方式做迭代,上一个流程完毕之后才进入到下一个流程. 这种模式有一个最大的好处就是下一个流程的准备相对充分,但是缺陷也显而易见,那就是迭代成本太大且显得笨重. 随着互联网行业的发展,“快”成了这个行业最重要的一个口诀,于是类似“唯快不破”成为大受追捧的产品设计哲学.

存一笔时间储蓄

- 成韵 - 左岸读书_blog
作者:[德]玛利昂·屈斯腾马赫、维尔纳·屈斯腾马赫. “您永远也不可能掌握时间,而我们自身却一直在时间的控制之下. ”这个毫不留情的分析 出自于慕尼黑经济学教授、著名的时间管理专家卡尔海茨A•格斯勒. 但是他并不觉得这个结果是个坏消息,他认为:“人们真正要做的,不是逆时而生,而是顺时 而活. ”过去我们总说时间是挤出来的,可是以后能使您成功的,却是如何灵活地与时间做朋友的能力.

如何管理时间

- JimQ - 褪墨
本文来自读者 xjdfanyi 投稿,原文来自李开复. 人的一生两个最大的财富是:你的才华和你的时间. 才华越来越多,但是时间越来越少,我们的一生可以说是用时间来换取才华. 如果一天天过去了,我们的时间少了,而才华没有增加,那就是虚度了时光. 所以,我们必须节省时间,有效率地使用时间. 做你真正感兴趣、与自己人生目标一致的事情.

瓶中流转的时间

- Zhaojing - 果壳网 guokr.com - 果壳网
DIYer:duckcrazy 制作时间:3小时 制作难度:★★☆☆☆ GEEK指数:★★☆☆☆. ○ 2L饮料瓶×3(最好是不同牌子的,这样瓶子大小也会有点差异,可以套在一起). ○ 120g的纸,用于打印(编者注:120g指的是每平方米纸重120克). 选择100%透明、有个弧形底的瓶子.