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

MrF*_*pes 11 python timezone datetime zoneinfo python-3.9

查看zoneinfoPython 3.9 中的模块,我想知道它是否还提供了一个方便的选项来检索 Windows 上的本地时区(操作系统设置)。

\n

在 GNU/Linux 上,你可以这样做

\n
from datetime import datetime\nfrom zoneinfo import ZoneInfo\n\nnaive = datetime(2020, 6, 11, 12)\naware = naive.replace(tzinfo=ZoneInfo(\'localtime\'))\n
Run Code Online (Sandbox Code Playgroud)\n

但在 Windows 上,这会抛出

\n
\n

ZoneInfoNotFoundError: \'未找到包含关键本地时间的时区\'

\n
\n

那么我还需要使用第三方库吗?例如

\n
import time\nimport dateutil\n\ntzloc = dateutil.tz.gettz(time.tzname[time.daylight])\naware = naive.replace(tzinfo=tzloc)\n
Run Code Online (Sandbox Code Playgroud)\n

由于time.tzname[time.daylight]返回本地化名称(在我的例子中为德语,例如 \'Mitteleurop\xc3\xa4ische Sommerzeit\'),因此这也不起作用:

\n
aware = naive.replace(tzinfo=ZoneInfo(tzloc))\n
Run Code Online (Sandbox Code Playgroud)\n

有什么想法吗?

\n
\n

ps 要在 Python < 3.9 上尝试此操作,请使用backports(另请参阅此答案):

\n
pip install backports.zoneinfo\npip install tzdata # needed on Windows\n
Run Code Online (Sandbox Code Playgroud)\n

Mat*_*int 10

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

来自文档:

如果不带参数(或使用tz=None)调用,则假定系统本地时区。转换后的日期时间实例的属性.tzinfo将设置为带有从操作系统获取的区域名称和偏移量的时区实例。

因此:

from datetime import datetime

naive = datetime(2020, 6, 11, 12)
aware = naive.astimezone()
Run Code Online (Sandbox Code Playgroud)


MrF*_*pes 5

虽然astimezone(None)很方便,但有时您可能希望获取操作系统配置使用的时区的IANA 名称。但请注意,Windows 不使用 IANA 数据库;需要从“Windows 时区”到 IANA 标识符的映射。该映射可能是错误的,请参阅下面 Philip Couling 的回答

版本 4tzlocal也将用于zoneinfo此目的,同时pytz通过弃用 shim保持兼容性:

>>> import tzlocal
>>> print(tzlocal.get_localzone())
Europe/Berlin
>>> print(repr(tzlocal.get_localzone()))
_PytzShimTimezone(zoneinfo.ZoneInfo(key='Europe/Berlin'), 'Europe/Berlin')
Run Code Online (Sandbox Code Playgroud)

[更新]在版本 5 中,删除了 pytz 弃用垫片,另请参阅tzlocal 的自述文件

>>> import tzlocal
>>> print(tzlocal.get_localzone())
Europe/Berlin
>>> print(repr(tzlocal.get_localzone()))
_PytzShimTimezone(zoneinfo.ZoneInfo(key='Europe/Berlin'), 'Europe/Berlin')
Run Code Online (Sandbox Code Playgroud)