为什么datetime.now()和datetime.utcnow()返回不同的时间戳记

问题描述 投票:2回答:1

我正在使用日期时间,发现很难理解timestamp()的工作原理,我(在东海岸)想将日期时间转换为时间戳,但是我发现以下差异。任何人都可以阐明这两个代码各自的工作方式,是否应该以不同的方式行事(大约相差四个小时)?

import datetime
datetime.datetime.utcnow().timestamp()
#1590436949.187297
datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
#1590422553.042119
python datetime timestamp utc
1个回答
1
投票

timestamp()方法返回始终指向UTC的时期以来的POSIX时间戳/秒。

重要:如果您将朴素的datetime对象传递给timestamp(),Python将假定datetime对象持有本地时间

这是timestamp()的问题。尽管名称datetime.datetime.utcnow()可能表示其他含义,但它为您提供了一个简单的日期时间对象,即它不“知道”它在UTC中。因此,如果调用utcnow()方法,则Python assumes传递给该函数的datetime对象是本地时间,而不是从timestamp()中得到的结果。

另一方面,在time.time()中,将时区识别日期时间对象传递给time.time()。就给您datetime.datetime.now(tz=datetime.timezone.utc).timestamp()而言,这是正确的。

插图:

timestamp()

您可以看到,即使time.time()天真,Python也会返回与从本地化import datetime import time import dateutil localtzname = time.tzname[time.daylight] # naive: dt_now = datetime.datetime.now() # timezone-aware: dt_now_loc = datetime.datetime.now(dateutil.tz.gettz(localtzname)) dt_now_utc = datetime.datetime.now(tz=datetime.timezone.utc) # reference: ts = time.time() print(dt_now.timestamp()) # 1590424623.226529 print(dt_now_loc.timestamp()) # 1590424623.226529 print(dt_now_utc.timestamp()) # 1590424623.226529 print(ts) # 1590424623.2265291 dt_now获得的时间戳相同的时间戳。

总而言之, dt_now_loc可能会产生误导,我建议您避免使用它。

© www.soinside.com 2019 - 2024. All rights reserved.