Python-time.time()和datetime.datetime.utcnow()。timestamp()返回不同的纪元

时间:2019-04-10 01:39:53

标签: python datetime utc

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

我问是因为我已将代码部署到AWS Lambda,该代码使用datetime模块生成纪元时间戳。当我们提取数据时,我试图转换为本地时间字符串(也使用datetime),与预期的时间相差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(左)和我的本地计算机上运行的相同代码。我的系统时钟正确。

time.time() vs datetime.utcnow().timestamp()

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

如果我在AWS上运行“ datetime.datetime.utcnow()”,则我的本地计算机(以及我也拥有的各种测试计算机(EC2 AWS实例))将返回相同的值。 “ .timestamp()”函数引起更改。

此外,time.time()显然仅返回自Epoch以来的时间。 “……这是特定于平台的。平台可以按时间返回它想要的任何东西,只要它以使localtime和gmtime正常工作的方式返回即可。也就是说,通常是GMT,或者,而不是UTC(Windows)或UTC-leap-seconds(大多数其他平台)。” 参见:Does Python's time.time() return a timestamp in UTC?

答案 2 :(得分:0)

让我们在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 :(得分:0)

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

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

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

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

enter image description here