我正在使用日期时间,发现很难理解timestamp()的工作原理,我(在东海岸)想将日期时间转换为时间戳,但是我发现以下差异。任何人都可以阐明这两个代码各自的工作方式,是否应该以不同的方式行事(大约相差四个小时)?
import datetime
datetime.datetime.utcnow().timestamp()
#1590436949.187297
datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
#1590422553.042119
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
可能会产生误导,我建议您避免使用它。