#python #strptime
#python #strptime
Вопрос:
У меня есть строка datetime 2020-10-23T11:50:19 00:00
. Я могу проанализировать его без часового пояса как:
>>> datetime.strptime('2020-10-23T11:50:19', '%Y-%m-%dT%H:%M:%S')
datetime.datetime(2020, 10, 23, 11, 50, 19)
Но у меня возникли проблемы с анализом его с 00:00
версией часового пояса. Каков был бы правильный способ сделать это?
>>> datetime.strptime('2020-10-23T11:50:19 00:00', '%Y-%m-%dT%H:%M:%S ???')
Комментарии:
1. %Y-%m-%dT%H:%M:%S%z
2. Во-первых, у вас поменялись местами аргументы. Строка формата идет второй.
3. @JohnGordon извините, да, я обновил вопрос.
4. Я не понимаю голосов, чтобы закрыть этот вопрос, поскольку «нужны детали или ясность». Кажется понятным, о чем спрашивает OP.
5. Действительно, похоже, вы едва пропустили это обновление в версии 3.7. Вы могли бы предварительно обработать строки, чтобы удалить это крайнее правое двоеточие?
Ответ №1:
Вы ищете %z:
>>> datetime.strptime('2020-10-23T11:50:19 00:00', '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2020, 10, 23, 11, 50, 19, tzinfo=datetime.timezone.utc)
Остерегайтесь некоторых замечаний по совместимости с версиями Python:
Изменено в версии 3.7: когда
%z
strptime()
методу предоставляется директива, смещения UTC могут иметь двоеточие в качестве разделителя между часами, минутами и секундами. Например,' 01:00:00'
будет проанализирован как смещение в один час. Кроме того, предоставление'Z'
идентично' 00:00'
.
Более надежный подход, это не strptime
так, но он все еще находится в stdlib начиная с Python 3.7:
>>> datetime.fromisoformat('2020-10-23T11:50:19 00:00')
datetime.datetime(2020, 10, 23, 11, 50, 19, tzinfo=datetime.timezone.utc)
Как указано в документации, эта функция поддерживает строки в формате:
YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][ HH:MM[:SS[.ffffff]]]]
где * может соответствовать любому одиночному символу (не только T).
Ответ №2:
dateutil.parser
Функция проанализирует этот формат часового пояса:
from dateutil.parser import parse
dt = parse('2020-10-23T11:50:19 00:00')
print(dt.date())
print(dt.time())
print(dt.tzinfo)
Результат:
2020-10-23
11:50:19
tzutc()
Вы можете объединить отдельные date
time
tzinfo
объекты и в a datetime
, если это то, что вам нужно, вот так:
dt = datetime.combine(dt.date(), dt.time(), tzinfo=dt.tzinfo)
print(dt)
Результат:
2020-10-23 11:50:19 00:00