MrF*_*pes 11 python timezone datetime zoneinfo python-3.9
查看zoneinfo
Python 3.9 中的模块,我想知道它是否还提供了一个方便的选项来检索 Windows 上的本地时区(操作系统设置)。
在 GNU/Linux 上,你可以这样做
\nfrom 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\nZoneInfoNotFoundError: \'未找到包含关键本地时间的时区\'
\n
那么我还需要使用第三方库吗?例如
\nimport 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\'),因此这也不起作用:
aware = naive.replace(tzinfo=ZoneInfo(tzloc))\n
Run Code Online (Sandbox Code Playgroud)\n有什么想法吗?
\nps 要在 Python < 3.9 上尝试此操作,请使用backports
(另请参阅此答案):
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)
虽然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)