В чем разница между datetime.datetime.now (). Timestamp () и datetime.datetime.utcnow (). Timestamp ()?

Насколько я понимаю, секунды с эпохи Unix (1970-01-01 00:00:00 UTC) должны быть одинаковыми во всем мире, поскольку они привязаны к UTC.

Теперь, если вы находитесь в часовом поясе с несколькими часами +/- UTC, почему вы получаете разные временные метки, если вы это делаете (+2 часа в моем случае)

>>> datetime.datetime.utcnow().timestamp()
1523622844.637763
>>> datetime.datetime.now().timestamp()
1523630048.558158

Если учесть время, которое мне потребовалось для запуска 2-й строки кода, можно прийти к выводу, что разница между двумя временными метками составляет 7200 секунд (2 часа). Разве эти временные метки не должны знать часовой пояс?


person TeXnophobe    schedule 13.04.2018    source источник


Ответы (3)


Из документации:

  • datetime.now(): возвращает текущую местную дату и время.
  • datetime.utcnow(): возвращает текущую дату и время в формате UTC [...]. Это похоже на now(), но возвращает текущие дату и время в формате UTC как наивный datetime

Просто пример:

Компенсировать

In [1]: datetime.datetime.now()
Out[1]: datetime.datetime(2018, 4, 13, 17, 8, 4, 457551)

In [2]: datetime.datetime.utcnow()
Out[2]: datetime.datetime(2018, 4, 13, 15, 8, 5, 385598)

Без смещения

In [3]: datetime.datetime.now(tz=pytz.utc)
Out[3]: datetime.datetime(2018, 4, 13, 15, 8, 59, 590874, tzinfo=<UTC>)

In [4]: datetime.datetime.utcnow()
Out[4]: datetime.datetime(2018, 4, 13, 15, 9, 1, 494370)
person floatingpurr    schedule 13.04.2018
comment
Спасибо, pytz, кажется, решает мое непонимание часового пояса. - person TeXnophobe; 13.04.2018
comment
Хороший! Не стесняйтесь принять такой ответ, который он решил :) - person floatingpurr; 13.04.2018

datetime.now() и utcnow() не знают TZ (то есть tzinfo по умолчанию - None).

Из документации (https://docs.python.org/3.6/library/datetime.html#datetime.datetime.timestamp):

Предполагается, что наивные экземпляры datetime представляют местное время

И, что немаловажно:

Примечание. Не существует способа получить метку времени POSIX непосредственно из наивного экземпляра datetime, представляющего время в формате UTC. Если ваше приложение использует это соглашение и часовой пояс вашей системы не установлен на UTC, вы можете получить метку времени POSIX, указав tzinfo=timezone.utc: timestamp = dt.replace(tzinfo=timezone.utc).timestamp() или вычислив метку времени напрямую:

timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

Другими словами, в вашем примере правильное значение для временной метки - второе (с использованием now()).

person pills    schedule 13.04.2018

В BIOS вашего компьютера может быть установлено местное время вместо времени UTC. Обычно для систем, работающих под управлением unix-подобных операционных систем, время в формате UTC является нормой. Для систем под управлением Windows местное время является нормой. .now () должен отображать то же время, которое вы видите на часах на вашем компьютере, в то время как .utcnow () НЕ знает о смещении вашего часового пояса, установленном в вашей ОС, и отображает дату и время в формате UTC.

person Chris J.    schedule 13.04.2018