Как автоматически получить смещение часового пояса для моего локального часового пояса?

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

print time.timezone/3600

Это получает смещение (в настоящее время не так), так как оно автоматически не корректирует переход на летнее время и не-DST.

Я также пробовал:

now_utc = pytz.utc.localize(datetime.datetime.now())
now_mst = now_utc.astimezone(pytz.timezone('US/Mountain'))

Это получает правильное значение смещения, но я бы хотел установить часть "US/Mountain" автоматически, поэтому мне не нужно вручную вводить что-либо, чтобы получить смещение.

Есть ли способ получить правильное смещение, которое автоматически настраивается с помощью DST и не-DST?

Я буду запускать этот script на нескольких серверах в разных географических регионах, и я хочу автоматически получить tz-смещение, если смогу.

Ответ 1

Для этого вы можете использовать dateutil. Чтобы получить локальный часовой пояс прямо сейчас:

>>> import dateutil.tz
>>> import datetime
>>> localtz = dateutil.tz.tzlocal()
>>> localtz.tzname(datetime.datetime.now(localtz))
'EDT'

Сейчас я в восточном дневном свете. Вы можете увидеть, как это изменится в EST в будущем, после перехода на летнее время:

>>> localtz.tzname(datetime.datetime.now(localtz) +
                   datetime.timedelta(weeks=20))
'EST'

Если вам требуется смещение от UTC, вы можете использовать функцию utcoffset. Он возвращает timedelta:

>>> localtz.utcoffset(datetime.datetime.now(localtz))
datetime.timedelta(-1, 72000)

В этом случае, поскольку я UTC-4, он возвращает -1 дней + 20 часов. Вы можете конвертировать его в часы, если это необходимо:

>>> localoffset = localtz.utcoffset(datetime.datetime.now(localtz))
>>> localoffset.total_seconds() / 3600
-4.0