0

Как разобрать часовой пояс с двоеточием

13

Проблема: Парсинг часового пояса в формате "+00:00" с помощью datetime.strptime

Я столкнулся с проблемой при попытке разобрать строку времени в формате "12:34:56+00:00" с использованием функции datetime.strptime в Python 3.4.3.

Вот пример кода, который я использую:

from datetime import datetime

# Попытка разобрать строку времени в формате "+00:00"
datetime.strptime("12:34:56+0000", "%X%z")  # Это работает
datetime.strptime("12:34:56+00:00", "%X%z")  # Это вызывает ошибку

При выполнении последней строки возникает следующая ошибка:

ValueError: time data '12:34:56+00:00' does not match format '%X%z'

Похоже, что функция strptime не может корректно обработать часовую зону в формате с двоеточием.

Есть ли возможность разобрать строку времени с часовым поясом в формате "+00:00" с помощью datetime.strptime? Или мне стоит выбрать другой подход? Буду благодарен за любые советы!

3 ответ(ов)

0

На данный момент нет лечения для этой проблемы, и вот объяснение: https://bugs.python.org/issue15873, а точнее здесь: https://bugs.python.org/msg169952.

Но вы можете обойти эту проблему следующим образом:

from datetime import datetime
d = "2015-04-30T23:59:59+00:00"
if ":" == d[-3:-2]:
    d = d[:-3] + d[-2:]
print(datetime.strptime(d, "%Y-%m-%dT%H:%M:%S%z"))

Этот код проверяет, есть ли двоеточие за 3 символа до конца строки, и если да, то удаляет его, прежде чем парсить строку в объект datetime с учётом временной зоны.

0

Python >= 3.7:

С помощью стандартной библиотеки datetime можно легко преобразовать строку, содержащую дату и время с информацией о временной зоне, в объект datetime. Пример кода:

from datetime import datetime
d = "2019-12-25T23:59:59+00:00"
print(datetime.strptime(d, "%Y-%m-%dT%H:%M:%S%z"))

Изменения в версии 3.7: Когда директива %z используется в методе strptime(), смещения UTC могут содержать двоеточие в качестве разделителя между часами и минутами. Например, '+01:00:00' будет интерпретироваться как смещение в один час. Кроме того, использование 'Z' эквивалентно '+00:00'.

Документация: datetime

Python ⇐ 3.6:

В предыдущих версиях Python нет встроенного способа, но можно использовать следующий метод как лучшее решение:

from datetime import datetime
d = "2019-12-25T23:59:59+00:00"
if ":" == d[-3]:
    d = d[:-3] + d[-2:]
print(datetime.strptime(d, "%Y-%m-%dT%H:%M:%S%z"))

Дополнительные объяснения:
Баг №15873
Сообщение

0

Другим решением является использование библиотеки dateutil:

from dateutil import parser

mystr = '2015-04-30T23:59:59+00:00'

x = parser.parse(mystr)

# 2015-04-30 23:59:59+00:00

Эта библиотека позволяет легко парсить строки с датами и временем, включая обработку временных зон. В приведенном примере строка mystr преобразуется в объект datetime, который сохраняет всю необходимую информацию, включая смещение по времени.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь