【问题标题】:How can I get an accurate UTC time with Python?如何使用 Python 获得准确的 UTC 时间?
【发布时间】:2015-11-27 06:10:19
【问题描述】:

我编写了一个桌面应用程序并使用datetime.datetime.utcnow() 来设置时间戳,但是我最近注意到有些人使用该应用程序得到的结果与我同时运行该程序时得到的结果大相径庭。有什么方法可以在本地获取 UTC 时间而不使用 urllib 从网站获取它?

【问题讨论】:

    标签: python datetime timestamp utc


    【解决方案1】:

    Python 依赖于底层操作系统来提供准确的时钟。如果它不这样做,那么除了绕过 o/s 之外,您别无选择。有一个 NTP 客户端 here 的纯 Python 实现。一个非常简单的方法:

    >>> import ntplib,datetime
    >>> x = ntplib.NTPClient()
    >>> datetime.datetime.utcfromtimestamp(x.request('europe.pool.ntp.org').tx_time)
    datetime.datetime(2009, 10, 21, 7, 1, 54, 716657)
    

    但是,不断访问其他 NTP 服务器并不是一件好事。一个好的网民会使用 ntp 客户端库来跟踪 o/s 系统时钟与从服务器获取的时钟之间的偏移量,并且只定期轮询以调整时间。

    【讨论】:

    • 通过monkeypatching,您可以记录该偏移量,并更改日期时间库方法以在应用程序的某些部分要求时间时应用偏移量。如果时间和日期时间库能够自动处理这种偏移,那就太好了。你可以告诉它你想要真实世界的时间,它会访问一个 NTP 服务器,记录偏移量,并在每次使用该时间时应用它。
    • 这不考虑发出请求的“往返时间”。您要做的是使用time.clock() 测量NTPClient() 响应的时间,将其分成两半并将其添加到给定时间。这是准确的。
    【解决方案2】:

    实际上,ntplib 计算此偏移量时会考虑往返延迟。 它可以通过 NTP 响应的“偏移”属性获得。因此结果应该不会很疯狂。

    【讨论】:

    • 这是一个有用的评论,但不是答案。你应该把它移到上面的 cmets 中。
    • 我认为它提供了一种答案,即 OP 的观察(非常不同的结果)可能是错误的。在没有原子钟的情况下,有人想在本地获取 UTC 时间吗?
    • @Trilarion:我没有看到不同计算机返回不同时间的异常情况。甚至if the time is synchronized using ntp; it may differ by tens of milliseconds on the internet。您不需要本地原子钟,以毫秒、微秒精度获取 UTC 时间(如果您想要数十纳秒的精度,则无论如何都不知道实时),您可以使用 GPS(例如,通过相同的 ntp 软件)。对于规模:relativistic effects are microseconds per day here
    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多