time 简史
程序员难免会跟 time 打交道, 大部分的编程语言, 都会有 time 相关的 API, 有时候会涉及到各种 time 之间的转换, 很多时候我们不是特别清楚地球的 time 究竟是怎么 work 的, 为什么会有 UTC, GMT 等等之类的东西. 下面我们讨论一下.
首先, 地球是一个24h/圈的速度进行自转, 这构成了我们的一天, 然而, 地球上不同的经度, 看到日出的时间肯定是有先后的. 所以, 比如你说 12:00pm,这个只能说是你这个经度的 12:00pm, 跟你相邻的经度, 可能也是 12:00pm, 不过有的是 12:00:12, 有的快 12:01 了, 如果以一分钟为误差, 地球可以有1440个不同的 12:00pm, 如果你不旅行或者去跟很远的地方通信, 这是没问题, 19世纪的城市, 都会根据他们的经度, 有一个自己的时间.
直到后来, 你们也知道, 人类的交通工具越来越快, 通信速度越来越快, 更是拉近了不同经度的人的距离. 当你跟一个身处纽约的人通话, 那么你们两个怎么去定义几点了呢?
这个时候, 我们发明了 time zone 的概念. 每隔一个小时, 就是一个新时区, 然后设立一个主时区, 以英国格林威治所在的那个时区为主时区(向东7.5度, 向西7.5度), 即GMT(Greenwich Mean Time), 这样我们就给地球定义了24个时区. 但是我们也不能完全经度来划定, 因为有些国家的领土, 会跨越多个时区, 所以实际的时区线是这样的:
GMT vs UTC
你可能还听过 UTC 这个名词, 那么 UTC 跟GMT 什么关系呢?
- UTC 不是一个 time zone, 它是一个 time standard. 它的值是0经度的 time, 没有任何一个地方以 UTC 来作为当地时间. time zone 是基于它建立的.
时区是根据针对 UTC 的 offset 来表达的, 比如北京时间就是 UTC+8. - GMT 是一个 time zone, 只不过它是主时区, 跟 UTC 的时间相同而已.
在 UK, 不是在全年都使用 GMT 的, GMT 只是 UK 的冬令时, 他们会在 DST(Daylight Saving Time) 来的时候, 切换到 BST(British Summer Time), 也就是夏令时, 比 GMT 提前一个小时.
DST(daylight saving time)
夏天来的时候, 日照时间会变长, 在一战时期的德国, 为了节能, 会在夏天来的时候, 把时间调快一个小时. 这个习惯至今在北美和西欧仍然使用, 即使研究表明, 人类用在照明的能源只是全部使用能源的一小部分.![]()
有颜色的地方, 是使用 daylight saving time 的.
使用 daylight saving time 的地方, 我们是无法仅仅根据其经度来知道当地时间的, 我们还得知道它是否正处在 DST.
DST 开始的时候(也就是夏令时开始的时候), 钟会拨快一个小时. (什么叫拨快? 就是比它所处的时区快一个小时).
DST 结束的时候(也就是夏令时结束, 进入冬令时), 钟会调慢一个小时, 也就是重新调回来.![]()
OS如何处理time
tz database, 是所有的程序和 OS 处理时间所使用的方式. 它记录了所有的历史时区的变化, since 1970, 也记录了 DST 的信息.
它的格式通常是 America/New_York 这种格式. 这个 database 通常是编译成平台相关的二进制文件, 然后 OS 负责提供相关的 API. 比如 localtime(), mktime().
程序员如何使用time
- 使用 UTC, 来存储 time
不要使用 local time, 因为它是有歧义的, 即使你的程序不会跨越时区使用. - 使用数据库的时候, 搞清楚它是如何处理 time zone 的
很多 database, 会有DataTime这个数据类型, 并且内置了时区转换, 搞清楚它们是怎么 work 的再使用.
timestamp and Unix time
这两个通常容易搞混.
- timestamp 用来记录一个 event 发生的时间. 可以有很多格式, 比如
2007-11-09 T 11:20 UTC,1256953732(unix time)等. compute 会用 timestamp 来记录 log event, 或者文件的修改时间等. - unix time 是一个 32-bit 的数字, 它记录的是现在距离1970年0:00:00 UTC 的秒数. 比如我现在的 unix time, 是
1541838757, 翻译成 UTC, 是11/10/2018 @ 8:32am (UTC).
原文作者: dgb8901,yinxing
原文链接: https://www.itwork.club/2018/11/12/time/
版权声明: 转载请注明出处
为您推荐

体验小程序「简易记账」

关注公众号「特想学英语」