13 December 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.
如果你能比较流畅地阅读英文,可以试着看:
http://www.perl.com/lpt/a/2003/03/13/datetime.html

我只翻译了一些我认为应该知道的内容。

基础概念

  • UTC/GMT/Z
    UTC 是 Coordinated Universal Time 的缩写
    GMT 是 Greenwich Mean Time 的缩写。格林威治时间。
    Z 是美国军方所用的。所以你如果在时间里看到里面有个 Z 字,比如 2005-12-13T14:59:37Z 就说明它是个 GMT 时间。
    Perl 中的 gmtime 就是属于这方面的。
  • 与之相对的是 Local Time, Perl 中对应的是 localtime
    为什么有 gmtime 和 localtime 这是因为地球是圆的和还有太阳的关系。在英国中午十二点在中国并不是中午十二点。
    这就涉及到另外一个概念。Time Zone 时区。更复杂的是时区的加加减减不是固定的。
    其中还涉及到 Daylight Saving Time,在 Daylight Saving Time 的影响下某地相对英国可能是相差五个小时,而没有这个影响的话只有四个小时。
    当然我们不用管这个东西,我地理也学得不是很好。学得好的同学已经把这个搞定了,我直接拿来用就是了。(不要怪我不好学,实在是没兴趣再去学习一次地理了。)
  • 上面的是现实中的问题,接下来是电脑的问题了。英文中涉及到的 epoch 的意思经常是从某一时间开始算起的秒数。
    比如 Unix 系统下的 epoch 就是从 1970 年一月一日的 GMT 时间开始算秒。但是并不是所有的系统都是从这个时间开始算起的。
    Perl 中获取这个 epoch 我们用 time 函数就可以了。
    另外我们还有个电脑问题。因为现在我们大部分人都在用 32 位的处理器,把 32 位的最大值做为秒,然后换算一下也只有 136 年。所以现在的大部分 Unix 系统都只能处理 1902-2038 这个时间段。
    这就是所谓的 epoch 问题。有些模块是有这个问题的(比如 Class::Date ),而有些模块是没这个问题的(比如 Date::Simple )。如果你发现某个模块处理不了这个时间段外的年,那就说明是有这个问题的。写代码的时候要小心一点。
    因为 epoch 有这些问题,所以一般而言最好不要用这个来保存你的时间。(除非不得已)
  • 日历。一般我们都使用阳历,即所谓的 The Gregorian Calendar。而作为中国人还有阴历,The Chinese Calendar。还有希伯来历等等。


blog comments powered by Disqus