【问题标题】:Convert NTP timestamp to Unix time将 NTP 时间戳转换为 Unix 时间
【发布时间】:2022-02-02 02:26:25
【问题描述】:

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

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

【问题讨论】:

    标签: python time ntp


    【解决方案1】:

    ntplib python 库将 NTP 时间戳与 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 服务器并从请求及其响应中返回相关的时间。

    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
    

    【讨论】:

    • 啊,我的错误是使用tx_timestamp 而不是tx_time。我会将您的答案标记为解决方案。感谢您的帮助:)
    • xx_timestamp 是 1900 纪元的 NTP 时间,xx_time 是 Unix 时间 1970 纪元。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2013-04-07
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多