Почему python 2.7 не включает символ Z (Zulu или нулевое смещение) в конце строки isoformat объекта datetime UTC, в отличие от JavaScript?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
В то время как в javascript
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
datetime.datetime.utcnow().isoformat() + 'Z'
Ответы:
datetime
По умолчанию объекты Python не имеют информации о часовом поясе, а без нее Python фактически нарушает спецификацию ISO 8601 ( если информация о часовом поясе не указана, предполагается, что это местное время ). Вы можете использовать пакет pytz, чтобы получить некоторые часовые пояса по умолчанию, или напрямую создать подклассtzinfo
себя:Затем вы можете вручную добавить информацию о часовом поясе в
utcnow()
:Обратите внимание, что это ДЕЙСТВИТЕЛЬНО соответствует формату ISO 8601, который позволяет использовать либо,
Z
либо+00:00
в качестве суффикса для UTC. Обратите внимание, что последний на самом деле лучше соответствует стандарту в том, как в целом представлены часовые пояса (UTC - это особый случай).источник
Z
вместо+00:00
?pytz
нарушаетtzinfo
протокол Python и опасен в использовании! См. Blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.htmldateutil
работать, не были реализованы до Python 3.6 с PEP 495, так чтоpytz
не использовать стандартный интерфейс несправедливо, потому что интерфейс изменился. До изменения единственный способ заставить это работать - это способpytz
сделать это.Опция:
isoformat()
Python
datetime
не поддерживает суффиксы военных часовых поясов, такие как суффикс Z для UTC. Следующая простая замена строки делает свое дело:str(d)
по сути то же самое, чтоd.isoformat(sep=' ')
См .: Datetime, Стандартная библиотека Python.
Опция:
strftime()
Или вы можете использовать
strftime
для достижения того же эффекта:Примечание. Этот параметр работает только в том случае, если вы знаете, что указанная дата находится в формате UTC.
См .: datetime.strftime ()
Дополнительно: часовой пояс, читаемый человеком
В дальнейшем вы можете быть заинтересованы в отображении информации о часовом поясе, удобочитаемой человеком,
pytz
сstrftime
%Z
флагом часового пояса:источник
T
вместо пробела?d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=datetime.timezone.utc)
в строке 2. Между прочим , в RFC3339 говорится, что пробел - это «нормально» (вместо «Т»).Следующие скрипты javascript и python дают идентичные результаты. Я думаю, это то, что вы ищете.
JavaScript
Python
На выходе они дают время в формате utc (zelda), отформатированное как строка ISO со значащей цифрой 3 миллисекунды и дополненной буквой Z.
источник
В Python> = 3.2 вы можете просто использовать это:
источник
Z
вы можете.isoformat()[:-6] + 'Z'
Даты Python немного неуклюжи. Используйте
arrow
.Arrow по сути имеет тот же api, что и datetime, но с часовыми поясами и некоторыми дополнительными тонкостями, которые должны быть в основной библиотеке.
Формат, совместимый с Javascript, может быть достигнут следующим образом:
Javascript
Date.parse
незаметно сбросит микросекунды с отметки времени.источник
На этот пост есть много хороших ответов, но я хотел, чтобы формат был таким же, как в случае с JavaScript. Это то, что я использую, и это хорошо работает.
источник
источник
Я подошел к этой проблеме с несколькими целями:
timezone
служебной функции Django иdateutil
парсераЭтот подход не включает суффикс Z и не используется
utcnow()
, но он основан на рекомендациях в документации Python и проходит проверку с помощью Django и JavaScript.Начнем с передачи объекта часового пояса UTC
datetime.now()
вместо использованияdatetime.utcnow()
:Это выглядит хорошо, так что давайте посмотрим , что Джанго и
dateutil
думает:Хорошо, объект datetime Python и строка ISO 8601 "осведомлены" о UTC. Теперь давайте посмотрим, что думает JavaScript о строке datetime. Из этого ответа получаем:
Вы также можете прочитать этот пост в блоге .
источник
Объединив все ответы выше, я получил следующую функцию:
источник
Я использую маятник:
источник
Или, чтобы получить его одним махом:
источник