【问题标题】:Get local time zone name on Windows (Python 3.9 zoneinfo)在 Windows 上获取本地时区名称(Python 3.9 zoneinfo)
【发布时间】:2020-10-01 11:14:10
【问题描述】:

查看 Python 3.9 中的 zoneinfo 模块,我想知道它是否还提供了一个方便的选项来检索 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: '没有找到键为 localtime 的时区'

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

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))

有什么想法吗?


附言要在 Python backports(另请参阅 this answer):

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

【问题讨论】:

    标签: python datetime timezone zoneinfo python-3.9


    【解决方案1】:

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

    来自文档:

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

    因此:

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

    【讨论】:

    • 如果夏令时在当前日期和您尝试打印的日期时间之间存在差异,这是否有效?
    • @MarkRansom - 是的。
    • 我只是仔细检查了一下,确实你是对的。这是一个很棒的隐藏功能!
    【解决方案2】:

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

    new version 4.1 of tzlocal 也将为此使用zoneinfo,同时通过deprecation shim 保持与pytz 的兼容性:

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

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2013-08-17
      • 2018-10-14
      • 2011-01-09
      相关资源
      最近更新 更多