получить местный часовой пояс в 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')