【问题标题】:Python - time.time() and datetime.datetime.utcnow().timestamp() returning different EpochsPython - time.time() 和 datetime.datetime.utcnow().timestamp() 返回不同的纪元
【发布时间】:2019-04-10 01:39:52
【问题描述】:

这实际上是两个问题: 第一,无论时区如何,所有机器上的 Epoch (Unix) 时间戳是否都相同(假设它们的系统时钟是正确的)?

我问是因为我已将代码部署到 AWS Lambda,该代码使用 datetime 模块生成 Epoch 时间戳。当我们提取数据时,我正在尝试转换为本地时间字符串(也使用日期时间),并且与预期的时间相差 2 小时。然后我开始测试以下代码:

import datetime
import time

print(time.time()) #1
print(datetime.datetime.utcnow().timestamp()) #2

print#1: 1554747526.775873
print#2: 1554783526.775873

在我的本地机器上运行,它们相差两个小时。我将上述代码部署到 AWS Lambda,它们返回相同的值。我的机器上有什么不同?下面的屏幕截图显示了在 AWS Lambda(左)和我的本地机器上运行的相同代码。我的系统时钟是正确的。

【问题讨论】:

  • 我在我的 ubuntu 桌面和我的安卓手机上都注意到了同样的事情。两台机器都有 2 小时的差异。

标签: python datetime utc


【解决方案1】:

原因与您计算机的时区有关。库time 使用您计算机中设置的时区,但对于datetime 库,您使用的是UTC 时区。为了获得同一时区的时间戳,请使用datetime.datetime.now().timestamp()

【讨论】:

  • 在我的电脑和手机上,datetime.utcnow().timestamp() 比 time.time() 少 2 小时,而 datetime.now().timestamp() 和 time.time 一样()。但是 datetime.utcnow() 确实给出了正确的 UTC 小时。请注意,因此我在计算机和手机上实际显示的时钟时间比 datetime.utcnow().timestamp() 多 4 小时...
【解决方案2】:

让我们比较一下 Digital Ocean 本地 PC 和服务器上的调用。

datetime.now() - PC 和服务器 3 小时有差异;

datetime.utcnow() - 在两台机器上相等;

但是

datetime.utcnow().timestamp() - 在 10800 秒处有差异!!!

# local machine (Win64) UTC+0
>>> datetime.now(), datetime.utcnow(), datetime.utcnow().timestamp()
(datetime.datetime(2019, 8, 2, 22, 13, 39, 535678),   # datetime.now()
datetime.datetime(2019, 8, 2, 19, 13, 39, 535678),    # datetime.utcnow()
1564762419.535678)                                    # datetime.utcnow().timestamp()

# server(Ubuntu 18) UTC+2.0
>>> datetime.now(), datetime.utcnow(), datetime.utcnow().timestamp()
(datetime.datetime(2019, 8, 2, 19, 13, 39, 253675),   # datetime.now()
datetime.datetime(2019, 8, 2, 19, 13, 39, 253691),    # datetime.utcnow()
1564773219.253692)                                    # datetime.utcnow().timestamp()

【讨论】:

    【解决方案3】:

    问题在于“.timestamp()”函数。

    如果我在 AWS 上运行“datetime.datetime.utcnow()”,我的本地机器(以及我也拥有的各种测试机器(EC2 AWS 实例))它们返回相同的值。 “.timestamp()”函数导致了变化。

    另外,time.time() 显然只返回 Epoch 以来的时间。 “......这是特定于平台的。一个平台可以返回任何它想要的时间,只要它以一种使 localtime 和 gmtime 正常工作的方式这样做。话虽如此,它通常是 GMT - 或者,而是 UTC (Windows) 或 UTC-except-for-leap-seconds (大多数其他平台)。" 见:Does Python's time.time() return a timestamp in UTC?

    【讨论】:

      【解决方案4】:

      根据timestamp() 上的文档,似乎utcnow()now() 返回“naive”而不是“aware”日期时间。我想这意味着他们不知道时区是什么或类似的东西。

      他们的解决方案似乎是在设置时区的日期时间调用时间戳:

      datetime.datetime.utcnow().replace(tzinfo= datetime.timezone.utc).timestamp()
      datetime.datetime.now().replace(tzinfo= datetime.timezone.utc).timestamp()
      

      第一个等价于time.time()。 第二个将返回与您的时区等效的时间戳。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-23
        • 1970-01-01
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        • 2015-10-22
        • 1970-01-01
        • 2013-05-09
        相关资源
        最近更新 更多