将 NTP 时间戳转换为 Unix 时间

Convert NTP timestamp to Unix time

我正在从 NTP 服务器获取当前时间。 NTP 的参考纪元是 1900 年 1 月 1 日的 0:00:00.000,我用于 NTP 的库 returns 自该参考纪元以来经过的秒数。如您所见,它的工作方式与 Unix 时间类似,只是它使用不同的参考纪元。 因此,我的目标是将这个 NTP 时间戳转换为 unix 时间戳,同时避免所有那些奇怪的事情,比如闰年、闰秒和人类对他们的时间尺度所做的所有其他奇怪的事情。

天真的方法显然是计算 NTP 参考时期和 Unix 参考时期之间发生的秒数,将其存储为常量并从 NTP 时间戳中减去它,但我觉得我这样做太愚蠢了,忘记了前面提到的一些奇怪之处。因此,我的问题是 Python 是否有一些内置函数,或者是否有一个库可以做到这一点。

ntplib python 库将 NTP 时间戳 to/from Unix 时间转换为自 1970 年 1 月 1 日以来的秒数。

import ntplib
from datetime import datetime, timezone

dt = datetime.now(timezone.utc)
ts = dt.timestamp()
print("datetime:", dt)
print("timestamp:", ts)

# convert native timestamp to NTP time
ntptime = ntplib.system_to_ntp_time(ts)
print("NTP time: ", ntptime)

# convert NTP time to native timestamp
ts = ntplib.ntp_to_system_time(ntptime)
print("timestamp:", ts)

输出:

datetime: 2022-02-01 18:22:56.530085+00:00
timestamp: 1643739776.530085
NTP time:  3852728576.530085

该库还实现了一个 NTP 客户端来查询 NTP 服务器和return来自请求及其响应的关联时间。

import ntplib
from datetime import datetime

client = ntplib.NTPClient()
server = 'pool.ntp.org'

resp = client.request(server, version=3)

print("offset", resp.offset)
print("delay", resp.delay)

# timestamps are converted to native "UNIX" timestamps
print(resp.orig_time)

print("orig_time:", datetime.utcfromtimestamp(resp.orig_time))
print("recv_time:", datetime.utcfromtimestamp(resp.recv_time))
print("tx_time  :", datetime.utcfromtimestamp(resp.tx_time))
print("dest_time:", datetime.utcfromtimestamp(resp.dest_time))

输出:

offset 0.007886648178100586
delay 0.002925395965576172
1643738937.685132
orig_time: 2022-02-01 18:08:57.685132
recv_time: 2022-02-01 18:08:57.693858
tx_time  : 2022-02-01 18:08:57.693956
dest_time: 2022-02-01 18:08:57.688134