从UTC偏移获取时区缩写

4

我在我的数据库中为用户存储了UTC偏移量:

+5:30 

如何使用Python从UTC偏移量获取时区缩写?
例如:
+5:30 => IST

使用Python实现这个目标是否可行?


1
UTC和时区缩写之间没有一个确切的1:1映射关系,有些是唯一的,而有些则不是。在世界的许多地方,给定区域的缩写会在一年中的不同时间更改(冬令/夏令时间或标准/夏令时间),距离UTC的偏移量也会随之改变。这就成为了一个有趣的问题。 - Jonathan Leffler
@JonathanLeffler 这些地区没有任何标准缩写吗?或者这些地区可以近似到最接近的标准时区缩写吗? - Viren Rajput
你需要定义“最接近的可用标准时区缩写”的含义。如果提供地理位置信息,则有办法将其转换为时区名称(迂回的方法,但确实存在),但缩写也取决于您要查找信息的日期。如果您只提供与UTC的偏移量而没有地理位置或日期参考,则会遇到歧义。+1:00的时区偏移量可能是BST或CET等,具体取决于您所在的世界位置。有关更多信息,请参见IANA时区 - Jonathan Leffler
3个回答

7

这是不可能的。

  • 有许多时区共享相同的偏移量。详情请参见维基百科文章

  • 没有统一的时区缩写标准。这里列出了一些:这里这里,你可以看到两个方向上的重复。

    例如:

    • CST 可能为 -5:00、-6:00、+8:00、+9:30 或 +10:30。
    • -10:00 可以是 HST、HAST、TAHT 或 CKT。

还要阅读在StackOverflow上的时区标签wiki中的“时区!=偏移量”一节。


1
你现在可以获得一个(零个或多个)与给定的UTC偏移相对应的时区缩写集合(如tz数据库中指定的)。
#!/usr/bin/env python
from datetime import datetime, timedelta
import pytz # $ pip install pytz

utc_offset = timedelta(hours=5, minutes=30) # +5:30
now = datetime.now(pytz.utc) # current time
print({now.astimezone(tz).tzname() 
       for tz in map(pytz.timezone, pytz.all_timezones_set)
       if now.astimezone(tz).utcoffset() == utc_offset})

输出

set(['IST'])

如果您想获取包括历史数据在内的缩写:

#!/usr/bin/env python
from datetime import datetime, timedelta
import pytz # $ pip install pytz

utc_offset = timedelta(hours=5, minutes=30) # +5:30
abbr = set()
now = datetime.now(pytz.utc)
for tz in map(pytz.timezone, pytz.all_timezones_set):
    dt = now.astimezone(tz)    
    tzinfos = getattr(tz, '_tzinfos',
                      [(dt.utcoffset(), dt.dst(), dt.tzname())])
    abbr.update(tzname for off, _, tzname in tzinfos if off == utc_offset)
print(abbr)

输出

set(['IST'])

自从Python 3.9版本以后,pytz已经不再需要了,标准库中已经包含了zoneinfo - undefined
1
@FObersteiner,你可能需要在某些系统上安装tzdata,然后以类似的方式使用zoneinfo.available_timezones(),就像上面答案中使用pytz.all_timezones_set一样。 - undefined

0

正如Matt所指出的那样,从偏移量到时区并没有太多意义。

如果你想要为给定的偏移量找到一个合适的pytz.timezone对象:

有各种各样的时区,从"Etc/GMT-14""Etc/GMT+12"

只需查看pytz.all_timezones即可。

使用它们,我能够将错误的客户端输入(误将时区误认为是偏移量)用于给我的用户附加有效的时区对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接