пример strptime для даты и времени со смещением tz

#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