Ответ 1
Начиная с Python 3.7, datetime.datetime.fromisoformat()
может обрабатывать ваш формат:
>>> import datetime
>>> datetime.datetime.fromisoformat('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))
В более старых версиях Python вы не можете, не без кропотливого ручного определения часового пояса.
Python не включает в себя базу данных часовых поясов, потому что она слишком быстро устареет. Вместо этого Python использует внешние библиотеки, которые могут иметь гораздо более быстрый цикл выпуска, чтобы предоставить вам правильно настроенные часовые пояса.
Как побочный эффект, это означает, что разбор часовых поясов также должен быть внешней библиотекой. Если dateutil
слишком тяжелый для вас, используйте вместо него iso8601
, он отлично проанализирует ваш конкретный формат:
>>> import iso8601
>>> iso8601.parse_date('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=<FixedOffset '-04:00'>)
iso8601
колоссальный 4KB маленький. Сравните это с python-dateutil
148KB.
Начиная с Python 3.2 Python может обрабатывать простые часовые пояса, основанные на смещении, и %z
будет анализировать смещения часового пояса -hhmm
и +hhmm
во временной метке. Это означает, что для временной отметки ISO 8601 вам придется удалить :
в часовом поясе:
>>> from datetime import datetime
>>> iso_ts = '2012-11-01T04:16:13-04:00'
>>> datetime.strptime(''.join(iso_ts.rsplit(':', 1)), '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))
Отсутствие правильного разбора ISO 8601 отслеживается в выпуске Python 15873.