如何使用 Python ntplib 将 ntp 服务器时间精确到毫秒?
How to ntp server time down to millisecond precision using Python ntplib?
我正在创建一个 python 模块,该模块将从选择的 NTP 池服务器中输出精确到毫秒的时间,作为展示服务器时间戳如何变化的练习。到目前为止,我已经能够将原始服务器时间戳打印到秒精度内,但我怎样才能获得毫秒精度?
ntp_pool = '0.pool.ntp.org', \
'uk.pool.ntp.org', \
'ie.pool.ntp.org'
def get_ntp_time():
for item in ntp_pool:
call = ntplib.NTPClient()
response = call.request(item, version=3)
print(time.ctime(response.orig_time))
for 循环可能会使您的结果变色,因为每次迭代都会有时间流逝。
无论如何,ntp 响应是具有微秒精度的时间戳,因此限制似乎在 time.ctime
以内,仅下降到秒级精度
您可以改用 datetime.fromtimestamp
,也可以选择 strftime
使其更漂亮。我的示例半心半意地模仿了您现有代码的输出。
from datetime import datetime
def get_ntp_time():
for item in ntp_pool:
call = ntplib.NTPClient()
response = call.request(item, version=3)
t = datetime.fromtimestamp(response.orig_time)
print(t.strftime("%a %b %d %H:%M:%S.%f"))
我认为这里有些误导:response.orig_time
是发出请求的客户端的时间,而不是服务器的时间。请参阅 IETF RFC5905,第 23 页:“原始时间戳 (org):请求离开服务器时在客户端的时间 [...]”。最新版本的代码应该类似于
import ntplib
from datetime import datetime, timezone
NTP_SERVERS = ['0.pool.ntp.org', 'uk.pool.ntp.org']
for server in NTP_SERVERS:
client = ntplib.NTPClient()
response = client.request(server, version=3)
print(f"server: {server}")
print(f"client time of request: {datetime.fromtimestamp(response.orig_time, timezone.utc)}")
print(f"server responded with: {datetime.fromtimestamp(response.tx_time, timezone.utc)}")
...会给我例如
server: 0.pool.ntp.org
client time of request: 2019-12-18 13:58:52.224058+00:00
server responded with: 2019-12-18 13:58:51.289734+00:00
server: uk.pool.ntp.org
client time of request: 2019-12-18 13:58:52.314615+00:00
server responded with: 2019-12-18 13:58:51.377655+00:00
请注意,根据信号必须传输的距离,如果以毫秒为单位,往返延迟 (response.delay
) 可能会很重要。
我正在创建一个 python 模块,该模块将从选择的 NTP 池服务器中输出精确到毫秒的时间,作为展示服务器时间戳如何变化的练习。到目前为止,我已经能够将原始服务器时间戳打印到秒精度内,但我怎样才能获得毫秒精度?
ntp_pool = '0.pool.ntp.org', \
'uk.pool.ntp.org', \
'ie.pool.ntp.org'
def get_ntp_time():
for item in ntp_pool:
call = ntplib.NTPClient()
response = call.request(item, version=3)
print(time.ctime(response.orig_time))
for 循环可能会使您的结果变色,因为每次迭代都会有时间流逝。
无论如何,ntp 响应是具有微秒精度的时间戳,因此限制似乎在 time.ctime
以内,仅下降到秒级精度
您可以改用 datetime.fromtimestamp
,也可以选择 strftime
使其更漂亮。我的示例半心半意地模仿了您现有代码的输出。
from datetime import datetime
def get_ntp_time():
for item in ntp_pool:
call = ntplib.NTPClient()
response = call.request(item, version=3)
t = datetime.fromtimestamp(response.orig_time)
print(t.strftime("%a %b %d %H:%M:%S.%f"))
我认为这里有些误导:response.orig_time
是发出请求的客户端的时间,而不是服务器的时间。请参阅 IETF RFC5905,第 23 页:“原始时间戳 (org):请求离开服务器时在客户端的时间 [...]”。最新版本的代码应该类似于
import ntplib
from datetime import datetime, timezone
NTP_SERVERS = ['0.pool.ntp.org', 'uk.pool.ntp.org']
for server in NTP_SERVERS:
client = ntplib.NTPClient()
response = client.request(server, version=3)
print(f"server: {server}")
print(f"client time of request: {datetime.fromtimestamp(response.orig_time, timezone.utc)}")
print(f"server responded with: {datetime.fromtimestamp(response.tx_time, timezone.utc)}")
...会给我例如
server: 0.pool.ntp.org
client time of request: 2019-12-18 13:58:52.224058+00:00
server responded with: 2019-12-18 13:58:51.289734+00:00
server: uk.pool.ntp.org
client time of request: 2019-12-18 13:58:52.314615+00:00
server responded with: 2019-12-18 13:58:51.377655+00:00
请注意,根据信号必须传输的距离,如果以毫秒为单位,往返延迟 (response.delay
) 可能会很重要。