Unix时间和leap seconds(闰秒)简要分析

author:onceday date:2022年6月3日

文章目录

  • Unix时间和leap seconds(闰秒)简要分析
    • 1.基本介绍
    • 2.unix时间如何处理闰秒
    • 3.为什么使用Unix时间戳
    • 4.Unix时间戳带来的问题
    • 注:本内容收集整理于互联网,仅供学习交流之用!

1.基本介绍

在现有的世界时间体系中,存在多种标准,然而用得最多的就是世界时和原子时了。世界时是根据地球自转为准的时间尺度,然而由于多种因素影响,因此地球自转并不稳定,导致世界时也不是均匀的时间尺度。 以原子震荡周期为基础,并由世界度量衡局以世界各国家实验室原子钟群加权平均产生之时间尺度称为国际原子时。原子时相对世界时稳定,因此经过一段时间以后,国际原子时与世界时渐渐产生了不一致。为了 使生活中之自然时刻能与原子时相符合,国际另外从国际原子时(TAI)引出一计时方式,称为协调世界时(UTC),作为最终之国际时刻标准。

此方式早期采用原子频率偏调,到公元一九七二年七月一日首次改用闰秒调整,当世界协调时(UTC)与一号世界时(UT1)之差(Difference UT1, DUT1)的绝对值预期在半年或一年之内将超过0.9秒时,为保持DUT1在0.9秒内,国际地球自转组织(International Earth Rotation Service, IERS)便会发布闰秒通告。在当年12月31日或6月30日的最后一分钟(UTC时间,换算北京时间为次年1月1日上午7时59分或7月1日上午7时59分)做闰秒调整。增加一秒时为正闰秒,减少为负闰秒。如果这一秒是被加载第二天的00:00:00前,则当决定加入正闰秒时,当天23:59:59的下一秒当记为23:59:60,然后才是第二天的00:00:00。如果是负闰秒,23:59:58的下一秒就是第二天的00:00:00了。

值得注意的是原子时(TAI)与世界时(UT1)分别来自于两个互不相干的系统,虽然 协调时(UTC)基本上解决了两者之间的协调问题,但是由于地球自转速度越来越慢加之不均匀,按照目前情况,不能排除若干年后出现一年闰几次甚至更多次秒 的可能性。因此IERS发布闰秒公告的时间也是不定的。

参考文档:

  • Shell Unix时间和闰秒_Shell_Unix Timestamp_Leap Second - 多多扣 (duoduokou.com)
  • Unix 时间和闰秒 - 堆栈内存溢出 (stackoom.com)

2.unix时间如何处理闰秒

Unix 时间数字在 Unix 纪元时为零,并且自纪元以来每天增加 86400。所以它不能代表闰秒。 操作系统将减慢时钟以适应这种情况。 就 Unix 时间戳而言,闰秒根本不存在。

如何理解呢?

对于Unix的时间戳来说,每天的时间秒数是固定的,即60x60x24=86400s,这意味着每秒的时间长度不是固定的

再来看一看真正准确的每秒时间是如何来的,即物理学意义上的精准时间单位!

GMT 和 UT1 基于地球在宇宙中的天文位置。 TAI 基于通过物理(原子)反应测量的在宇宙中经过的实际时间量。 在 TAI 中,每一秒都是一个“SI 秒”,它们的长度完全相同。 在 UTC 中,每一秒都是 SI 秒,但必要时会添加闰秒以将时钟重新调整回 GMT/UT1 的 0.9 秒以内。 GMT 和 UT1 时间标准是地球在宇宙中的位置和运动的经验测量定义的,这些经验测量不能通过任何方式(无论是科学理论还是近似)来预测。 因此,闰秒也是不可预测的。

很明显,Unix时间戳是与它们截然不同的,在有闰秒的日子里,午夜前的第二秒(午夜前 UTC 分钟的第 61 秒)被赋予与前一秒相同的时间戳。用直接的方式来看,其相同的 Unix 时间戳将用于两个真实世界的秒数。

X86399.0X86399.5X86400.0X86400.5X86400.0X86400.5X86401.0

如上所示,时间戳将被“重播”,闰秒时间戳也是前一个真实世界秒的时间戳。

3.为什么使用Unix时间戳

向标准库添加对闰秒的支持非常困难,因为无法预测未来的闰秒次数,因此日期2050 年 1 月 1 日无法存储为UTC时间戳,因为 IAU 不知道在接下来的几十年中我们必须添加多少闰秒。

而Unix时间非常简单,因为每年每天的时间戳是固定的。直接计算就可以了。

简而言之:UTC 全年都非常难以使用,而 Unix 时间仅在闰秒发生的瞬间才难以使用。

4.Unix时间戳带来的问题

>>> time.strptime("2017-1-1 7:59:60","%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2017, tm_mon=1, tm_mday=1, tm_hour=7, tm_min=59, tm_sec=60, tm_wday=6, tm_yday=1, tm_isdst=-1)
>>> a=time.mktime(_)
>>> time.localtime(a)
time.struct_time(tm_year=2017, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=1, tm_isdst=0)
>>> time.localtime(a-1)
time.struct_time(tm_year=2017, tm_mon=1, tm_mday=1, tm_hour=7, tm_min=59, tm_sec=59, tm_wday=6, tm_yday=1, tm_isdst=0)
>>>

2017年1月1日,北京时间7:59:60是一个闰秒,所以这一时刻存在60秒这个值,但在Unix时间戳里面可以看到,它实际等于8:00:00,意味着同一个时间戳对应了两个真实时间。

因此,在计时的时候,如果硬件定时器计时的时长和Unix时间戳出现了差距,很正常,不是说很小的精度误差,而是指来自于这类闰秒

因此,可以说Unix时间戳确实可以计算出当前的日期时间出来,但是日期的具体一天或者一个小时,或者直接点说,其中1秒,其时间长度并不真正意义上等于物理1秒,但在绝大数情况等于。

在没有网络校准时间时,如果经过了闰秒,大概率unix时间会快1秒(或者慢),因为计算机内部计时器误差还是很小的,能较准确的计算出当天走过的秒数。但是,一旦通过网络校准了 时间,就会去掉多出的一秒。

所以说,Unix时间戳每天的时间秒数是固定的,即60x60x24=86400s。

注:本内容收集整理于互联网,仅供学习交流之用!

Unix时间和leap seconds(闰秒)简要分析相关推荐

  1. php gmt文本转时间,PHP 使用gmdate将一个UNIX 时间格式化成 GMT 文本的简单示例

    对PHP gmdate –将一个UNIX 时间格式化成 GMT 文本感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 语法如下: /** * PHP gmdate –将一个UNIX 时间格 ...

  2. Go 学习笔记(48)— Go 标准库之 time (获取时/分/秒的单位值、标准时间和Unix时间转换、字符串时间和Time类型转换、时区转换、时间的加减/休眠)

    1. 概要说明 import "time" time 包提供了时间的显示和测量用的函数.日历的计算采用的是公历. Go 提供以下几种时间类型: 时间点 Time 时间段 Durat ...

  3. Android 5.1 Settings源码简要分析

    概述: 先声明:本人工作快两年了,仍是菜鸟级别的,惭愧啊!以前遇到好多知识点都没有记录下来,感觉挺可惜的,现在有机会接触Android 源码.我们一个Android组的搞Setting,我觉得是得写得 ...

  4. RxJava Agera 从源码简要分析基本调用流程(2)

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文由晋中望原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/communi ...

  5. linux 时间戳 微妙,unix时间点_毫秒和微妙_time模块

    时间的表示 计算机中时间的表示是从"1970 年 1 月 1 日 00:00:00"开始,以毫秒(1/1000 秒) 进行计算.我们也把 1970 年这个时刻成为"uni ...

  6. oracle 日期 加一秒,Leap Second (闰秒) 在ORACLE环境的影响

    科学上有两种时间计量系统:基于地球自转的天文测量而得出的"世界时"和以原子振荡周期确定的"原子时"."世界时"由于地球自转的不稳定(由地球物 ...

  7. python时间函数纳秒_在Python中以秒和纳秒获取POSIX / Unix时间?

    我一直在努力找到一种方法来获取自1970-01-01 00:00:00 UTC以来的时间,以秒为单位,在python中以纳秒为单位,我找不到能给我正确精度的任何东西. 我尝试过使用时间模块,但是精度只 ...

  8. 【u-boot】uboot代码简要分析 (u-boot 移植)

    uboot代码简要分析 (u-boot 移植) 2012-12-19 22:46:04 [转] 先来看看源码目录结构,再按照代码的执行顺序简单地分析源码 1.U-boot源码整体框架 源码解压以后,我 ...

  9. 计算机网络实验 ——wireshark抓包简要分析TCP、UDP协议

    [计算机网络实验 --wireshark抓包简要分析TCP.UDP协议] (1)分析 TCPheader: Source Port:16bit源端口,数据发起者的端口号: Destination Po ...

  10. unix时间2038问题

    自从找到工作之后好久没有更博客了...今天写php的时候遇到了个神奇的问题,现在来说一说~ 在php的时间方法里,mktime用的是unix时间戳,返回一个日期的 UNIX 时间戳.然后使用它来查找该 ...

最新文章

  1. 网络-开发-CIO全面覆盖——51CTO.com今日变脸
  2. 某程序的bug是什么意思?
  3. Python之lambda表达式和内置函数
  4. bzoj3410[Usaco2009 Dec]Selfish Grazing 自私的食草者*
  5. WIN7只能上QQ打不开网页,使用CMD输入netsh winsock reset
  6. linux 日志报告生成器,linux实战(一)----日志的截取-----文本过滤器grep、文本流式编辑器sed、报表生成器awk的运用...
  7. 区块链系列教程之:比特币中的挖矿
  8. User status for Service Order
  9. this和static
  10. Android studio的设置界面介绍
  11. 错误记录:自己创建activity时不能进行真机usb安装调试
  12. C++字符串拼接效率比较(+=、append、stringstream、spintf)
  13. python一行输出_#python版一行内容分行输出
  14. matlab 峰值提取,Matlab2019b信号峰值检测与提取
  15. 1型错误和2型错误_沈阳地铁1号线太原街站导向牌出现错误!
  16. 解析力 (1 )MTF SFR
  17. 高级商务办公软件应用【9】
  18. Windows中使用Java执行shell命令运行检测,通过sonarqube的webapi获取扫描结果
  19. Android驱动——WiFi驱动移植
  20. 2019年计算机专业录取分数线排名,2019中国高校录取分数线排名 全国大学录取分数线表...

热门文章

  1. Spyder5 显示器校准 色彩校准
  2. 车载视频监控基于JTT808/1078管理平台商业开源
  3. 计算机访问周期,访问周期最短的存储器是
  4. (Note)同比和环比
  5. 光纤交换机使用方法及应用方案详解
  6. Opengl ES Glew库 ----- By YDD的铁皮锅
  7. Win11将输入法的繁体改为简体
  8. 怎样用计算机做ppt,电脑怎么做ppt(教你几个小技巧做出高大上的ppt)
  9. Win10(Windows)系统中窗口切换 最大最小化窗口等快捷键
  10. 2021 年“认证杯”网络挑战赛 B 题(第一阶段)