Подтвердить что ты не робот

Как преобразовать строку с информацией о часовом поясе в datetime в python без dateutil?

Я должен преобразовать строку с информацией о часовом поясе в объект python datetime.

Например, 2012-11-01T04:16:13-04:00.

Я нахожу там модуль dateutil котором есть функция синтаксического анализа, но я не очень хочу использовать его, так как он добавляет зависимость.

Так как я могу это сделать? Я пробовал что-то вроде следующего, но безуспешно.

datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")
4b9b3361

Ответ 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.

Ответ 2

Вот Python Doc для объекта datetime, использующего пакет dateutil.

from dateutil.parser import parse

get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj

Ответ 3

В исходном вопросе есть две проблемы с кодом: не должно быть : в часовом поясе и строка формата для "часового пояса как смещение" - это нижний регистр %z не верхний %Z

Это работает для меня в Python v3.6

>>> from datetime import datetime
>>> t = datetime.strptime("2012-11-01T04:16:13-0400", "%Y-%m-%dT%H:%M:%S%z")
>>> print(t)
2012-11-01 04:16:13-04:00

Ответ 4

Я новичок в Python, но нашел способ конвертировать

2017-05-27T07:20:18.000-04:00 к

2017-05-27T07:20:18 без загрузки новых утилит.

from datetime import datetime, timedelta

time_zone1 = int("2017-05-27T07:20:18.000-04:00"[-6:][:3])
>>returns -04

item_date = datetime.strptime("2017-05-27T07:20:18.000-04:00".replace(".000", "")[:-6], "%Y-%m-%dT%H:%M:%S") + timedelta(hours=-time_zone1)

Я уверен, что есть лучшие способы сделать это, не нарезая строку так много, но это выполнило свою работу.

Ответ 5

Вы можете конвертировать, как это.

date = datetime.datetime.strptime('2019-3-16T5-49-52-595Z','%Y-%m-%dT%H-%M-%S-%f%z')
date_time = date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')