摘要:时间,格林威治时间年月日北京时间年月日起至现在的总秒数,表示为。协议中有四个时间戳,本文不讨论这四个时间戳的区别,只简单的拿其中一个时间戳报文分析如何转换成时间。例如一段时间戳报文为,下面我们一起学习该时间戳是如何转换成时间的。
前言:最近在学习时频产品时钟对时协议,在学习NTP协议时一直对协议报文中的时间戳转换存在疑问,通过各种搜集资料、自我理解后终于对NTP时间戳有了一个具体的认识;发现现阶段网上的免费资料里对整个转换没有写的很仔细,导致理解比较难,接下来我针对我学习后的理解,详细地讲一下NTP时间戳是如何转换成UTC时间的。(若有不对的地方,欢迎指出,共同进步)
正文:
首先简单讲一下NTP协议,相信搜到这篇文章的对NTP是有一定了解的,想进一步对NTP中某些字段定义学习深入一点。NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能。
在理解转换之前先讲一个NTP时间戳和UTC时间的定义(注意两种时间戳的起始时间不同,相差70年):
①NTP时间戳用一个64bit无符号定点数表示,它表示自从1990年1月1日00:00:00到现在过了多少秒。64bit分为两部分,高32bit(MSW)表示整数部分,单位是秒;低32bit(LSW)表示小数部分,单位是232皮秒。
②UTC时间,格林威治时间1970年1月1日00:00:00(北京时间1970年1月1日08:00:00)起至现在的总秒数,表示为1970-01-01 00:00:00 UTC。程序里习惯叫做UTC时间戳。
NTP协议中有四个时间戳,本文不讨论这四个时间戳的区别,只简单的拿其中一个NTP时间戳报文分析如何转换成UTC时间。例如一段时间戳报文为“D9 FD 84 95 94 F8 59 7C”,下面我们一起学习该NTP时间戳是如何转换成UTC时间的。
先处理MSW高位32bit“D9 FD 84 95”,将其转换为10进制3657270421,由于NTP时间和UTC时间起始不同,需要将该时间减少70年(1900年到1970年)2208988800(0x83AA7E80),则为1448281621,使用UTC转换器为2015-11-23 12:27:01 UTC(格林威治时间),2015-11-23 20:27:01 UTC+8(北京时间 UTC+8)
然后再处理LSW低位32bit“94 F8 59 7C”,在处理LSW之前先要了解1LSW=232ps是怎么来的,1 second =1,000,000,000,000 picoseconds,这个值很大,而2^32=4294967296,很明显用32bit无法精确到1 picoseconds,那就尽力而为,于是自然就把1,000,000,000,000 picoseconds劈成2^32份:
1,000,000,000,000/(2^32) = 232.83064365386962890625 即1LSW=232ps
故先将LSW乘以232转为ps,然后ps除以10^6就得到us了,于是有:usec=lsw*232/1000000
再看看秒的一些时间单位转换:
毫秒ms是10^-3秒;微妙us是10^-6秒;纳秒ns是10^-9秒;皮秒ps是10^-12秒
于是低位32bit“94 F8 59 7C”,将其转换为10进制2499303804,则:
usec=lsw*232/1000000=579838us=0.579838s
综上所述,故NTP时间戳“D9 FD 84 95 94 F8 59 7C”转换成UTC时间为2015-11-23 20:27:01.579838 UTC+8(北京时间)
写在最后的话:整理不易,若对你有帮助望支持点赞一下,谢谢。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119230.html
摘要:比如中国,从西到东横跨东五东六东七东八和东九五个时区,中华人民共和国成立以后,全国统一采用首都北京所在的东八时区的区时作为标准时间,称为北京时间。全球所有国家根据时间和各自国家所在的时区确定当地时间,以此来保证全球时间的低误差同步。 我们在编程时,不可避免地会和时间打交道。 比如要完成一次秒杀活动, 就会涉及到时间存取,时间同步和时间差值计算等诸多细节。一个JavsScript的简单例...
摘要:的模块提供了各种操作时间的功能。模块变量当地时间与标准时间的误差,以秒计当地夏令时时间与标准时间的误差,以秒计当地时间是否反映夏令时,默认为关于标准时区名称夏令时时区名称的元组模块方法将时间元组默认为本地时间格式转换为字符串形式。 Python的time模块提供了各种操作时间的功能。在大多数的编程语言中,表示时间的方法有两种,一是时间戳。即从1970年1月1日00:00:00开始按秒计...
摘要:本文时间与日期处理实战你肯定被坑过从属于笔者的前端入门与最佳实践中入门与最佳实践系列文章。然而由于地球的不规则自转,导致时间有误差,因此目前已不被当作标准时间使用。而在航空上,所有使用的时间划一规定是协调世界时。 本部分的知识图谱请参考编程语言知识图谱-时间与日期。showImg(https://segmentfault.com/img/remote/1460000007581725...
阅读 3116·2023-04-25 19:09
阅读 3845·2021-10-22 09:54
阅读 1693·2021-09-29 09:35
阅读 2859·2021-09-08 09:45
阅读 2171·2021-09-06 15:00
阅读 2737·2019-08-29 15:32
阅读 1010·2019-08-28 18:30
阅读 344·2019-08-26 13:43