Преобразование строки даты JSON в дату и время Python
При переводе дат в JSON javascript сохраняет даты в этом формате:
2012-05-29T19:30:03.283Z
Однако я не уверен, как получить это в объект datetime python. Я пробовал эти:
# Throws an error because the 'Z' isn't accounted for:
datetime.datetime.strptime(obj[key], '%Y-%m-%dT%H:%M:%S.%f')
# Throws an error because '%Z' doesn't know what to do with the 'Z'
# at the end of the string
datetime.datetime.strptime(obj[key], '%Y-%m-%dT%H:%M:%S.%f%Z')
Я считаю, что javascript сохраняет строку в официальном формате ISO, поэтому кажется, что должен быть способ заставить python datetime.strptime()
читать его?
Ответы
Ответ 1
Попробуйте следующий формат:
%Y-%m-%dT%H:%M:%S.%fZ
Например:
>>> datetime.datetime.strptime('2012-05-29T19:30:03.283Z', '%Y-%m-%dT%H:%M:%S.%fZ')
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000)
Z
в дате означает, что его следует интерпретировать как время UTC, поэтому игнорирование этого не приведет к потере информации. Вы можете найти эту информацию здесь: http://www.w3.org/TR/NOTE-datetime
Ответ 2
Чтобы предоставить альтернативу, если вы не возражаете против установки пакета python-dateutil
, вы можете использовать dateutil.parser.parse
. Имейте в виду, что формат ввода догадывается parse
; неверный ввод все равно может быть интерпретирован правильно или иначе.
Без часовой пояс
Если вы предпочитаете не устанавливать часовой пояс, что совершенно нормально, если вы представляете все время внутри себя только в формате UTC, используйте:
>>> dateutil.parser.parse('2012-05-29T19:30:03.283Z', ignoretz=True)
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000)
С часовым поясом
Обратите внимание, что в отличие от datetime.datetime.strptime
, этот вызов по умолчанию parse
автоматически сохраняет часовой пояс UTC.
>>> import dateutil.parser
>>> dateutil.parser.parse('2012-05-29T19:30:03.283Z')
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000, tzinfo=tzutc())
Если требуется утверждение теста для равенства, ожидаемый объект может быть сконструирован как:
>>> import datetime
>>> datetime.datetime(2012, 5, 29, 19, 30, 3, 283000, tzinfo=dateutil.tz.tzutc())