6

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

在 GNU/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
4

2 回答 2

5

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

从文档:

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

因此:

from datetime import datetime

naive = datetime(2020, 6, 11, 12)
aware = naive.astimezone()
于 2020-06-11T21:46:29.330 回答
2

虽然astimezone(None)很方便,但有时您可能希望获得您所在时区的IANA 名称,而不是 Windows 认为最适合您的名称。

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

>>> import tzlocal
>>> print(tzlocal.get_localzone())
Europe/Berlin
>>> print(repr(tzlocal.get_localzone()))
_PytzShimTimezone(zoneinfo.ZoneInfo(key='Europe/Berlin'), 'Europe/Berlin')
于 2020-10-22T10:50:10.347 回答