получить местный часовой пояс в Windows с помощью Python 3.9 zoneinfo

Проверяя zoneinfo модуля в Python3.9, мне было интересно, предлагает ли он также удобный вариант для получения местного часового пояса (настройки ОС) в Windows.

В Linux вы можете сделать

from datetime import datetime
from zoneinfo import ZoneInfo

naive = datetime(2020, 6, 11, 12)
aware = naive.replace(tzinfo=ZoneInfo('localtime'))

но в Windows это бросает

ZoneInfoNotFoundError: "Не найден часовой пояс с ключевым местным временем"

так что мне все равно придется использовать стороннюю библиотеку? например

import time
import dateutil

tzloc = dateutil.tz.gettz(time.tzname[time.daylight])
aware = naive.replace(tzinfo=tzloc)

поскольку time.tzname[time.daylight] возвращает локализованное имя (в моем случае немецкий, например, Mitteleuropäische Sommerzeit), это тоже не работает:

aware = naive.replace(tzinfo=ZoneInfo(tzloc))

Какие-нибудь мысли?


ps, чтобы попробовать это на Python < 3.9, используйте backports(см. также этот ответ):

pip install backports.zoneinfo
pip install tzdata # needed on Windows

1 ответ

Решение

Вам не нужно использовать zoneinfo, чтобы использовать местный часовой пояс системы. Вы можете просто пройтиNone (или опустить) часовой пояс при звонке datetime.astimezone.

Из документов:

Если вызывается без аргументов (или с tz=None) предполагается местный часовой пояс системы. В.tzinfo Атрибут преобразованного экземпляра datetime будет установлен в экземпляр часового пояса с именем зоны и смещением, полученными из ОС.

Таким образом:

from datetime import datetime

naive = datetime(2020, 6, 11, 12)
aware = naive.astimezone()

В то время как astimezone(None)Это удобно, иногда вы можете захотеть получить имя IANA для вашего часового пояса, а не то, что Windows считает лучшим для вас. Новая версия 3 tzlocal также будет использовать zoneinfo для этого:

>>> import tzlocal
>>> print(tzlocal.get_localzone())
Europe/Berlin
>>> print(repr(tzlocal.get_localzone()))
zoneinfo.ZoneInfo(key='Europe/Berlin')
Другие вопросы по тегам