почему datetime.now () и datetime.utcnow () возвращают разные отметки времени - PullRequest
2 голосов
/ 25 мая 2020

Я работаю с datetime и мне трудно понять, как работает timestamp (), я (на восточном побережье) хочу преобразовать datetime в timestamp, но я обнаружил следующую разницу. Может ли кто-нибудь пролить свет на то, как работает каждый из двух кодов, предполагается ли, что они будут действовать по-разному (разница примерно в четыре часа)?

import datetime
datetime.datetime.utcnow().timestamp()
#1590436949.187297
datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
#1590422553.042119

1 Ответ

1 голос
/ 25 мая 2020

Метод 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() может вводить в заблуждение, и я бы рекомендовал избегать его.

...