Ошибка даты и времени со смещением часового пояса с помощью двоеточий - PullRequest
0 голосов
/ 19 января 2019

В настоящее время мы работаем над приложением, которое пытается вычислить время прохождения маршрута от a до b, используя 2.db.transport.rest API.

К сожалению, мы получаем временные метки со смещением часового пояса от этого API, например +01:00. Нам нужно смещение часового пояса без :, поэтому +0100.

В следующем примере выдается ошибка в Linux с использованием Python 3.6.7:

from datetime import datetime
datetimestring = "2019-01-19T15:13:00.000+01:00"
datetime.strptime(datetimestring, '%Y-%m-%dT%H:%M:%S.%f%z')

Этот пример кода создает это исключение:

ValueError: time data '2019-01-19T15:13:00.000+01:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

Если мы удалим : из входной строки, она работает, исключение не выдается.

Код также работает, когда мы запускаем его в Windows, на Python 3.7.2.

Может ли это быть из-за разных версий Python? Как мы можем проанализировать или преобразовать это без ошибки?

1 Ответ

0 голосов
/ 19 января 2019

Да, это проблема версии.Вы полагаетесь на новую функцию , представленную в Python 3.7

Из datetime.strptime() документации , 6-я сноска:

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

Если вы не можете обновить до Python 3.7 везде, то вы можете просто удалить эти двоеточия с некоторой предварительной обработкой:

import re

datetimestring = re.sub(r'([-+]\d{2}):(\d{2})(?:(\d{2}))?$', r'\1\2\3', datetimestring)

Регулярное выражение удаляет двоеточия из любого смещения HH:MM или HH:MM:SS (появляется в конце строки и перед - или +):

Демо:

>>> import re
>>> from datetime import datetime
>>> datetimestring = "2019-01-19T15:13:00.000+01:00"
>>> corrected = re.sub(r'([-+]\d{2}):(\d{2})(?:(\d{2}))?$', r'\1\2\3', datetimestring)
>>> corrected
'2019-01-19T15:13:00.000+0100'
>>> datetime.strptime(corrected, '%Y-%m-%dT%H:%M:%S.%f%z')
datetime.datetime(2019, 1, 19, 15, 13, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600)))

Если бы вы обновлялись до Python 3.7 повсюду, вы могли бы вообще отказаться от разбора strptime() и просто использовать выделенный datetime.fromisoformat() метод ;он может анализировать ваш ввод напрямую.

>>> datetime.fromisoformat(datetimestring)
datetime.datetime(2019, 1, 19, 15, 13, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600)))
...