【问题标题】:Why the difference between datetime.datetime.now().timestamp() and datetime.datetime.utcnow().timestamp()?为什么 datetime.datetime.now().timestamp() 和 datetime.datetime.utcnow().timestamp() 有区别?
【发布时间】:2018-09-23 23:20:32
【问题描述】:

据我了解,自 Unix 纪元 (1970-01-01 00:00:00 UTC) 以来的秒数在全球各地应该是相同的,因为它固定为 UTC。

现在,如果您所在的时区有几个小时 +/- UTC,如果您这样做,为什么会得到不同的时间戳(在我的情况下是 +2 小时)

>>> datetime.datetime.utcnow().timestamp()
1523622844.637763
>>> datetime.datetime.now().timestamp()
1523630048.558158

如果您考虑到我运行第二行代码所花费的时间,您会得出结论,两个时间戳之间存在 7200 秒(2 小时)的差异。这些时间戳不应该是不知道时区的吗?

【问题讨论】:

    标签: python datetime timezone python-3.5 epoch


    【解决方案1】:

    来自docs

    • datetime.now():返回当前本地日期和时间。
    • datetime.utcnow():返回当前 UTC 日期和时间 [...]。这类似于 now(),但返回当前的 UTC 日期和时间,作为一个幼稚的 datetime

    只是一个例子:

    偏移

    In [1]: datetime.datetime.now()
    Out[1]: datetime.datetime(2018, 4, 13, 17, 8, 4, 457551)
    
    In [2]: datetime.datetime.utcnow()
    Out[2]: datetime.datetime(2018, 4, 13, 15, 8, 5, 385598)
    

    无偏移

    In [3]: datetime.datetime.now(tz=pytz.utc)
    Out[3]: datetime.datetime(2018, 4, 13, 15, 8, 59, 590874, tzinfo=<UTC>)
    
    In [4]: datetime.datetime.utcnow()
    Out[4]: datetime.datetime(2018, 4, 13, 15, 9, 1, 494370)
    

    【讨论】:

    • 谢谢,pytz 似乎解决了我对时区感知的误解。
    • 好!随意接受它解决的这样一个答案:)
    【解决方案2】:

    datetime.now()utcnow() 是 TZ 不感知的(也就是说,默认的 tzinfoNone)。

    来自文档 (https://docs.python.org/3.6/library/datetime.html#datetime.datetime.timestamp):

    假定原始日期时间实例代表本地时间

    而且,至关重要的是:

    注意:没有办法直接从 表示 UTC 时间的天真 datetime 实例。如果您的应用程序 使用此约定并且您的系统时区未设置为 UTC,您 可以通过提供tzinfo=timezone.utc 来获取 POSIX 时间戳: timestamp = dt.replace(tzinfo=timezone.utc).timestamp() 或通过 直接计算时间戳:

    timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

    换句话说,在您的示例中,时间戳的正确值是第二个(使用now())。

    【讨论】:

      【解决方案3】:

      您计算机的 BIOS 可能设置为本地时间而不是 UTC 时间。一般来说,对于像操作系统这样运行 unix 的系统来说,UTC 时间是常态。对于运行 Windows 的系统,本地时间是常态。 .now() 应该与您在计算机上看到的时钟显示相同的时间,而 .utcnow() 不知道您在操作系统中设置的时区偏移量,它会显示 UTC 日期和时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-06
        • 2015-01-10
        • 2016-04-21
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        • 2013-10-09
        • 2011-04-25
        相关资源
        最近更新 更多