人们自古以来“日出而作,日落而息”。而现如今,全球化越来越明显,大家凑到微博上交流时,发现不同地方日出而作的时间实际上是不一样的。张三在上海,他早上六点就日出而作了,而李四在新疆,到早上九点才日出而作。这差异还是很显的。正是由于大中国采用了统一的时间制度,才带来了这种差异。脑洞一下,如果全球都采用统一的时间制的话,大家的对话就不好开展了:在上海的张三跟远在巴黎的李四约早上八点开个远程会议,结果李四还在睡觉呢(那时候,他正是半夜刚过)……

**** 

时区(Time Zone)

时区(Time Zone)就是解救人们的得力工具。它使得地球上的不同区域使用同一个时间定义得以实现。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。时区是以地理经度的范围来划分的。位于本初子午线附近的时区为零时区,向两边分别为正负12时区。通常,我们所说的“相差一个时区”也就是相差一个小时的两个地理区域。

不过,最近的开发工作中,接触到一些有意思的时区相关的开发工作。发现现实中的时区其实没有像上面这一段,类似于地理课本上这么美好的叙述。下面是几个有意思的方面。

 

零时区(GMT)

中国标准时间(China Standard Time, CST)在日常生活中又称为北京时间,位于东八区,所以北京时间与零时区时间相差八小时,所以是 +8。那么什么时零时区呢?GMT。GMT 的全称是 Greenwich Mean Time,即格林尼治标准时间,它是一个时区,位于英国,具体说来,就是那个伦敦郊区。

那么我们平常所说的那个 UTC 又是怎么回事呢?虽然它与 GMT 之间的关系也并不简单,但我们依然可以简单地理解为:UTC 是一个时间标准,它不代表任何具体地理位置上的时区,仅用作时区之间的对比。

举例来说,我们东八区又表述为 UTC+8,却没有 GMT+8 的说法,因为 GMT 它是一个具体的时区,就像 CST 一样。

 

时区偏移(Time Zone Offset)

很简单,一个时区中的时间与 UTC 之间小时数的偏差称之为时区偏移。比如,CST 的 offset 为 8,GMT 的 offset 为 0。

值得注意的是,尽管地理上的时区只有 24 个,但实际上,地球上人们在使用的“逻辑时区”可远不止这个数字。很容易理解,比如中国叫“China Standard Time”,那新加坡虽然与北京差不多经度,也位于 UTC+8,他们总不会在国内说,我们使用“China Standard Time” 或者“北京时间”吧。于是乎,很多“逻辑时区”就出现了。这些“逻辑时区”与 UTC 之间的偏移并不总是那么规范,有的并不是整小时数,有 30 分钟零头的,还有 45 分钟零头的。

 

夏令时(DST)

上面说到,时区可以理解为是为了解决人们在相同生活习惯和自然现象(如起床、日出)发生在各地的具体时间点不同而产生的,比如日出在上海是 6 点,在新疆却在 9 点——那么理论上,如果将上海和新疆视作不同时区就可以让新疆人的日出时间也是 6 点(虽然我们没有这么做)。

那么在夏天,日出比通常更早。就出现了“即使在同一地点、一年内不同时间,同一现象发生的时间点也不同”的状况。所以为了让时区发挥更多作用,就在时区的基础上,再定义一个“夏令时”的概念,它让人们在夏季的时间点数推迟一个小时。这样,我们让原本在 6 点的日出发生在 7 点。是的,就是硬生生地将表的点数往前调一个小时。

等夏天过去,我们再恢复正常的时区偏移,那时候,又要选择一个良辰吉日将表往倒退一个小时。

中国现在没有使用夏令时的做法(不过,在学校和很多单位,有夏冬季使用不同作息时间表的习惯),但在全世界的范围中,夏令时却是一种广泛被采用的方法。需要注意的是,不同国家,以及不同年份,其进入和完成夏令时的时间并不一定相同;即使是相同的国家,也有可能在某一段时间内使用夏令时,而之后则不再使用。

很明显,当某个时区处于夏令时期间时,其时间与 UTC 之间的偏移比其他时间内多 1 小时。而上一节中提到的 时区偏移指的是该时区在非夏令时期间与 UTC 之间的偏移

 

时区给编程带来的挑战

最近重新部署了一下博客,服务器现在搬到了米国,也更新了一下博客程序到了比较新的版本。而还在国内的我,经常用东八区写博客,而服务器时间却是 –7 区的。因此会有一个很尴尬的情况:当我发布一篇文章时,博客程序认为还没到发布时间,结果不能正常浏览到。

可以看出,时区问题如果没能很好的处理,在编程实践中会得到意想不到的效果。特别是,当考虑到了 DST,考虑到了 Web 前后端的各种不同情况时,真是个有意思的话题。