intro1:一文搞懂unix time、unix epoch、utc时间、gmt时间
intro2: 大部分人对unix time的误解
本计划对上一篇文章做点补充,不过今天来点简单的。
unix time
许多人对 unix time有误解,只知其是相对世界时/格林威治时1970年1月1号0点0分0秒整的时间差,有的人可能还记得是0时区。
但这些认识是不对的。而一些文档如Java API Doc里写的并不全,或没有明确使阅读者明确理解。
笔者工作过程就曾经听到不同的人在做把unix timestamp 转化为格式化的时间时,会问时区是哪里的,或者认为其时区是本地或者0时区的是否+8。
排除这种误区实际上可以简单的记住一点即可:unix timestamp 是 相对于 UTC 时间的时间差,而 UTC 几乎是对等 GMT+0 的时间。
概念
先从Wikipedia介绍几个概念:
上述,UTC是协调世界时,即Universal Time Coordinated,英法两国联合定制,名字取二者调和。
上述,Unix time表示距离unix Epoch的秒数,但Unix time是不考虑闰秒的,这意味着如果你运行:
1) JAVA的System.out.println(new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss,SSS”).format(915148800750l));
系统输出的是 1999-01-01 08:00:00,750
2) 或python的 datetime.datetime.fromtimestamp(915148800.750).strftime(“%Y-%m-%d %H:%M:%S.%f”)
系统输出的是:1999-01-01 08:00:00.750000
但实际上 UTC时间 其实是 1998-12-31T23:59:60.75,而不是1999年1月1日。
地球的轨道和运动速度都不是均匀的,天文学家计算地球非圆形轨迹与极轴倾斜对视太阳时的效应,修正以后的实际即平太阳时,在格林尼治子午线上的平太阳时称为世界时(UT0),又叫格林尼治平时(GMT),为了兼容人们对天亮/天黑的常识(如正午12点表示太阳正当中),地球相应划分24个时区。
协调时是一个时间刻度标准,GMT是一个刻度,UTC即GMT+0,只是后来协调时的基准是原子钟,也就和GMT不相干了,虽然二者可能差距不过1秒。现在GMT时间已不再被科学界所使用,尽管GMT可转换为UTC。
但协调世界时和相差不会超过0.9秒,有需要时便会在协调世界时内加上正或负闰秒。因此协调世界时与国际原子时(TAI)之间会出现若干整数秒的差别。位于巴黎的国际地球自转事务中央局(IERS)负责决定何时加入闰秒。
NTP就是基于世界协调时的,北京时间即是 UTC+8 的。
其他
对了,计算机是怎么计算时间的,像Java的System.currenTimeMillis怎么获取Unix时间呢?
一般商用/办公/家用计算机主板上有计时电路,核心是晶体振荡器,靠电池供电维持一定频率的震荡,转化为时钟信号,无电量或电量不足就会归零或慢,此外这个信号频率不够稳定,受环境压力/温度影响,时间并不准确,所以通常会通过网络较时来修正。
但这个频率还不足以纳秒级别,像Java的System.nanoTime是需要高频的(1GHz),其实就是CPU内部电路产生的脉冲频率。
对于牛顿力学而言,摆钟的周期实际受重力影响,所以摆钟走时是不准的,而我们本身佩戴的机械手表同样受重力/摩擦力/气压/游丝重心/摆轮平衡等影响,据说世界上曾最精准的依赖石英震动的机械表每天误差千分之一秒,而如今大众佩戴的机械表如陀飞轮/defy等也只能每天0.25秒差异。
说因为相对论影响,机械钟测量不准而采用本20世纪发现的原子钟实际上不正确。
科学家们发现原子的能级跃迁释放电磁波,这种电磁波的频率是恒定的,通过一系列放大效应,人们就可以将其作为时间脉冲的节拍器,只不过这种节拍器最小可以做到每秒钟10^15次方次计数,然后逐层放大到秒/分钟等。原子钟不受气压/温度等影响,但其实是受重力影响的,曾有试验做过,飞行原子钟来回后和地球原子钟存在差异(微秒级别),这其实才是需要用相对论,而且是广义相对论解释了(时间膨胀)。
而现有的原子钟精确到 50亿年误差一秒,比地球年龄要大,可以认为是精度极高。
Ref
- 原子钟 https://baike.baidu.com/item/%E5%8E%9F%E5%AD%90%E9%92%9F/765460
- 时间膨胀 https://zh.wikipedia.org/wiki/%E6%99%82%E9%96%93%E8%86%A8%E8%84%B9
最精确原子钟问世:50亿年误差一秒 https://tech.qq.com/a/20141105/008961.htm - 一些语言的时间范围 https://zh.wikipedia.org/wiki/%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%97%B4
- Unix time https://en.wikipedia.org/wiki/Unix_time
- 讲了这么多年的CPU频率,到底是什么? https://zhuanlan.zhihu.com/p/30582175