在 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/Phoenix
和 America/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/