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

Python 为什么datetime.now()和datetime.utcnow()返回不同的时间戳,python,datetime,timestamp,utc,Python,Datetime,Timestamp,Utc,我正在使用datetime,发现很难理解timestamp()是如何工作的,我(在东海岸)想将datetime转换为时间戳,但我发现了以下区别。有人能解释一下这两个代码是如何工作的吗?他们的行为是否不同(大约相差四个小时) 该方法返回自历元(1970-01-01)以来的POSIX时间戳/秒,该历元始终指UTC 问题:如果对一个幼稚的datetime对象调用timestamp()方法,Python将假定datetime对象持有本地时间 尽管datetime.datetime.utcnow()中的u

我正在使用datetime,发现很难理解timestamp()是如何工作的,我(在东海岸)想将datetime转换为时间戳,但我发现了以下区别。有人能解释一下这两个代码是如何工作的吗?他们的行为是否不同(大约相差四个小时)

该方法返回自历元(1970-01-01)以来的POSIX时间戳/秒,该历元始终指UTC

问题:如果对一个幼稚的datetime对象调用
timestamp()
方法,Python将假定datetime对象持有本地时间

尽管
datetime.datetime.utcnow()
中的
utcnow()
可能会给出相反的建议,但它给了您一个天真的datetime对象。也就是说,它不“知道”它在UTC中。因此,如果调用
timestamp()
方法,Python会假定传递给函数的datetime对象是本地时间,并以此计算时间戳。那就不是你能从中得到的了

另一方面,在
datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
中,将时区感知的datetime对象传递给
timestamp()
。这是正确的,因为它为您提供了
time.time()

说明:

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\u now
很幼稚,但Python返回的时间戳与您从本地化的
dt\u now\u loc
time.time()
获得的时间戳相同


总之,
datetime.datetime.utcnow().timestamp()
可能会产生误导,我建议避免使用。

谢谢您的回复。问题是我想将所有的时间格式(可能是原始格式,也可能是tzinfo格式,具体取决于来源)转换为无时区的UTC时间,因此无论如何都不会出现混淆,这就是为什么我从一开始就使用utcnow()。@xappppp:如果你想避免混淆,请使用带有tzinfo集(tz感知)的datetime对象(由于Python会将naive视为本地的),或者坚持使用POSIX之类的时间戳,它总是引用UTC.related:
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