内容简介:程序员难免会跟 time 打交道, 大部分的编程语言, 都会有 time 相关的 API, 有时候会涉及到各种 time 之间的转换, 很多时候我们不是特别清楚地球的 time 究竟是怎么 work 的, 为什么会有 UTC, GMT 等等之类的东西. 下面我们讨论一下.首先, 地球是一个24h/圈的速度进行自转, 这构成了我们的一天, 然而, 地球上不同的经度, 看到日出的时间肯定是有先后的. 所以, 比如你说 12:00pm,这个只能说是你这个经度的 12:00pm, 跟你相邻的经度, 可能也是 12
程序员难免会跟 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)
.
以上所述就是小编给大家介绍的《time 简史》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
最优化理论与算法
陈宝林 / 清华大学出版社 / 2005-10-1 / 46.00元
最优化理论与算法(第2版),ISBN:9787302113768,作者:陈宝林 编著一起来看看 《最优化理论与算法》 这本书的介绍吧!