Как разобрать часовой пояс с двоеточием
Проблема: Парсинг часового пояса в формате "+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 ответ(ов)
На данный момент нет лечения для этой проблемы, и вот объяснение: 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 с учётом временной зоны.
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
Сообщение
Другим решением является использование библиотеки 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
, который сохраняет всю необходимую информацию, включая смещение по времени.
Как удалить неконвертированные данные из объекта datetime в Python
Как перевернуть строку в Python?
Как заполнить строку в Python пробелами?
Диапазон букв в Python
Преобразование строки даты JSON в datetime в Python