在 Windows 上获取本地时区名称(Python 3.9 zoneinfo)

Get local time zone name on Windows (Python 3.9 zoneinfo)

查看 Python 3.9 中的 zoneinfo 模块,我想知道它是否还提供了一个方便的选项来检索 [=42] 上的本地时区(OS 设置) =].

在GNU/Linux,你可以

from datetime import datetime
from zoneinfo import ZoneInfo

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

但是在 Windows 上抛出

ZoneInfoNotFoundError: 'No time zone found with key localtime'

所以我还需要使用第三方库吗?例如

import time
import dateutil

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

因为 time.tzname[time.daylight] returns 本地化名称(在我的例子中是德语,例如 'Mitteleuropäische Sommerzeit'),这也不起作用:

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

有什么想法吗?


p.s。要在 Python < 3.9 上尝试此操作,请使用 backports(另请参阅 this answer):

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

您不需要使用 zoneinfo 来使用系统本地时区。您可以在调用 datetime.astimezone 时简单地传递 None(或省略)时区。

来自文档:

If called without arguments (or with tz=None) the system local timezone is assumed. The .tzinfo attribute of the converted datetime instance will be set to an instance of timezone with the zone name and offset obtained from the OS.

因此:

from datetime import datetime

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

虽然 astimezone(None) 很方便,但有时您可能想要获取您所在时区的 IANA name,而不是 Windows 认为最适合您的时区。

new version 4.1 of tzlocal will also use zoneinfo for that whilst maintaining compatibility with pytz through the deprecation shim:

>>> import tzlocal
>>> print(tzlocal.get_localzone())
Europe/Berlin
>>> print(repr(tzlocal.get_localzone()))
_PytzShimTimezone(zoneinfo.ZoneInfo(key='Europe/Berlin'), 'Europe/Berlin')