如何使用Python ntplib将服务器时间降低到毫秒精度?

时间:2015-07-06 21:06:30

标签: python ntp

我正在创建一个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))

2 个答案:

答案 0 :(得分:4)

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"))

答案 1 :(得分:0)

我认为这里有些误导之处: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)可能会很长,这取决于信号必须传播多远。