在 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')
查看 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')