这实际上是两个问题: 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(左)和我的本地计算机上运行的相同代码。我的系统时钟正确。
答案 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()。 秒将返回与您的时区等效的时间戳。