Применить смещение часового пояса к дате и времени в Python

Для заданной строки даты, такой как 2009-01-01T12:00:00+0100 Я хочу объект даты и времени UTC.

from datetime import datetime 
datetime.strptime("2013-03-21T14:19:42+0100", "%Y-%m-%dT%H:%M:%S%z")

возвращается

datetime.datetime(2013, 3, 21, 14, 19, 42, tzinfo=datetime.timezone(datetime.timedelta(0, 3600)))

Я не могу поверить, что нет никакого метода в datetime или же pandas для применения смещения, связанного с часовым поясом, к дате и времени и возвращению простой даты и времени UTC.

Как я могу применить tzinfo смещение / дельта, так что результирующий часовой пояс будет простым UTC (tzinfo=None)?

4 ответа

Решение

Я не знаю о функции Pandas, но вы можете достичь этого с ванильным Python. Питона datetime.astimezone() метод интерпретирует tz=None как UTC:

from datetime import datetime
dt = datetime.strptime("2013-03-21T14:00:00+0100", "%Y-%m-%dT%H:%M:%S%z")
dt.astimezone()

Это эквивалентно:

datetime.datetime(2013, 3, 21, 13, 0, tzinfo=datetime.timezone(datetime.timedelta(0), 'UTC'))

Это немного грязно, но это работает

from datetime import datetime
orig_dt = datetime.strptime("2013-03-21T14:19:42+0100", "%Y-%m-%dT%H:%M:%S%z")  # datetime.datetime(2013, 3, 21, 14, 19, 42, tzinfo=datetime.timezone(datetime.timedelta(0, 3600)))
utc_time_value = orig_dt - orig_dt.utcoffset()
utc_dt = utc_time_value.replace(tzinfo=None)  # datetime.datetime(2013, 3, 21, 13, 19, 42)

Вот реальный код (встроенный):

from datetime import datetime, timezone, timedelta

return datetime(yy, mm, dd, hh, min, ss, 0, timezone(timedelta(hours=5)))       # +0500
# or
return datetime(yy, mm, dd, hh, min, ss, 0, timezone(timedelta(seconds=18000))) # +0500

Полагаюэто то, что вы хотите.

      from datetime import datetime, timezone
d = datetime.strptime("2013-03-21T14:19:42+0100", "%Y-%m-%dT%H:%M:%S%z") # 2013-03-21 14:19:42+01:00
d.astimezone(timezone.utc) # 2013-03-21 13:19:42+00:00

timezone.utcв этом случае не является необязательным параметром: в .astimezone()документации говорится

Если вызывается без аргументов (или с tz=None) в качестве целевого часового пояса предполагается локальный часовой пояс системы.

Это может привести к непреднамеренному поведению (в зависимости от вашего местного часового пояса).

Другие вопросы по тегам