Метод timestamp()
возвращает отметку времени POSIX в секундах с эпохи, которая всегда относится к UT C.
Важно: если вы передадите наивный объект datetime в timestamp()
, Python будет считать, что объект datetime содержит местное время .
Это проблема с datetime.datetime.utcnow()
. Хотя имя utcnow()
может указывать на иное, оно дает вам наивный объект datetime, то есть он не «знает» его в UT C. Следовательно, если вы вызываете метод timestamp()
, Python предполагает , что объект datetime, переданный функции, находится в локальном времени, и это не то, что вы получили бы от time.time()
.
С другой стороны, в 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_now
наивно, Python возвращает то же самое. метка времени, полученная из локализованного dt_now_loc
или time.time()
.
Таким образом, datetime.datetime.utcnow().timestamp()
может вводить в заблуждение, и я бы рекомендовал избегать его.