摘要:从当年、月、日的格林威治时间到当前年、月、日北京时间的总秒数。 其表达式为: 协议中有四个时间戳。 本文不讨论这四个时间戳之间的差异。 就拿其中一个时间戳数据包来分析一下如何将其转换为时间。 例如,时间戳消息了解如何将时间戳转换为时间。
简介:最近一直在研究时频产品的时钟同步协议。 当我研究NTP协议时,我一直想知道协议消息中时间戳的转换。 经过收集了大量的资料,加深了自我的了解,我终于了解了NTP协议。 我特别了解时间戳。 我发现目前网上的免费资料对于整个转换还不是很透彻,很难理解。 现在根据我学习后的理解,详细解释一下NTP时间戳是如何转换为UTC时间的。 (如果我发现有什么不对的地方,请指出,我们一起进步。)
正文:
首先,关于NTP我。会简单解释一下。 协议。 我希望你找到这篇文章。 我对NTP有一些了解,想进一步了解NTP中某些字段的定义。 NTP(Network Time Protocol)是基于UDP的网络时间协议。 用于网络时间同步的协议。 将网络中计算机的时钟与 UTC 同步,并针对每个时区进行偏移调整以实现准确的同步。
在了解转换之前,我们先讨论一下 NTP 时间戳和 UTC 时间的定义(注意,这两个时间戳的起始时间不同,相差 70 年)。
① NTP 时间戳使用 64 位无符号定点表示法,表示自 1990 年 1 月 1 日 00:00:00 以来经过的秒数。 64 位分为两部分,最高有效 32 位(MSW)代表整数部分。 ,单位为秒。 低32位(LSW)表示小数部分,以232皮秒为单位。
②格林威治时间1970年1月1日00:00:00开始的UTC时间(北京时间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“D9 FD 84 95”的高32位,并将其转换为十进制数3657270421。 由于NTP时间和UTC时间的起点不同,所以这个时间必须减少70年(1900年)。 2208988800 (0x83AA7E80),然后是 1448281621,使用 UTC 转换器:2015-11-23 12:27:01 UTC(格林威治标准时间)、2015-11-23 20:27 :01 UTC+ 8 (北京时间UTC+8)
接下来处理LSW低32位“94 F8 59 7C”。 在处理LSW之前,我们首先需要了解1LSW=232ps的由来。 1秒=1,000,000,000,000皮秒,这个值很大,2^32=4294967296。 显然,使用 32 位无法精确到 1 皮秒。 请尽力而为。 因此,自然地,1,000,000,000,000 皮秒被分为 2^32 部分:
1,000,000,000,000/(2^32) = 232.83064365386962890625 所以 1LSW= 232ps
因此,首先将LSW乘以232转换为ps,然后将ps除以10^6得到:usec=lsw*232/1000000
让我们看一下秒的一些时间单位转换:
毫秒 ms 是 10 ^-3 。 秒。 一微秒 us 是 10^-6 秒。 一纳秒 ns 是 10^-9 秒。 皮秒 ps 为 10^-12 秒
因此,将低 32 位“94 F8 59 7C”转换为十进制 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(北京时间)
结束语:整理起来并不容易。 如果您觉得有用,请支持、点赞、谢谢。
评论前必须登录!
注册