python - 如何将 Windows 时区转换为 pytz 理解的时区?

标签 python timezone pytz

在 windows python 环境中,我可以像这样获取本地时区,但它不能用于 pytz:

>>> import win32timezone
>>> win32timezone.TimeZoneInfo.local()
TimeZoneInfo(u'US Mountain Standard Time', True)
>>> win32timezone.TimeZoneInfo.local().timeZoneName
u'US Mountain Standard Time'
>>> tz = pytz.timezone(win32timezone.TimeZoneInfo.local().timeZoneName)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\pytz\__init__.py", line 185, in timezone
    raise UnknownTimeZoneError(zone)
pytz.exceptions.UnknownTimeZoneError: 'US Mountain Standard Time'

将输出转换为 pytz.timezone() 可以理解的时区名称的好方法是什么?


这是使用 tzlocal 的答案(感谢 Matt):

>>> from tzlocal.win32 import get_localzone_name
>>> get_localzone_name()
'America/Phoenix'
>>> tz = pytz.timezone(get_localzone_name())
>>> tz
<DstTzInfo 'America/Phoenix' MST-1 day, 17:00:00 STD>

最佳答案

不要根据名称对 Windows 时区 ID 的含义做出任何假设。例如,美国山区标准时间 实际上是亚利桑那州大部分地区的 Windows 时区,该地区永久采用 MST,因为它不实现夏令时。但是其余山区时区的 Windows ID 是 Mountain Standard Time - 确实在 Mountain Daylight Time 期间遵循夏令时,但时区 ID 没有改变!这两个区域 ID 之间的唯一区别是“US”前缀。在 IANA/Olson 数据库中,这是两个截然不同的区域 - America/PhoenixAmerica/Denver

您需要的是 Unicode CLDR 项目提供的从 Windows 到 Olson 时区 ID 的映射。阅读 TimeZone tag wiki获取信息和链接。我不确定是否已经有一个库在 Python 中实现了这一点——您可能需要做一些研究,或者自己从原始数据中实现它。

更新

经过一番搜索,我找到了一个名为 tzlocal 的 Python 库具有 CLDR 映射。它甚至可以包含一个脚本,该脚本将从 CLDR 网站获取当前映射并自行更新。我自己没有尝试过,但它似乎有正确的方法。它主要专注于以适合与 pytz 一起使用的 IANA/Olson id 返回当前系统时区。 Here is the author's blog post describing its usage.

关于python - 如何将 Windows 时区转换为 pytz 理解的时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156597/

相关文章:

javascript - 在 Javascript 中使用浏览器区域以外的时区

python - 如何显示输入的数字在哪个位置?

python - 如何使用 Nginx 反向代理部署 Telegram Bot

django - Google App Engine、parsedatetime 和 TimeZones

python - 为什么 Django 称我的 datetimes 天真而他们不是?

python - 在 python 中获取给定时区的 DST 边界

python - 将 UTC 时间戳转换为日期时间对象,将夏令时考虑在内

python - 使用腻子在远程机器上运行 Django 开发服务器。如何运行开发服务器?

python - 如何从视频中抓取一帧,然后对其进行操作,然后用它重新组合视频?

python - 定时任务 : Setting Timezone