3

我的数据库中有用户的 UTC 偏移量:

+5:30 

如何使用 Python 从这个 UTC 偏移量中获取时区缩写?

+5:30 => IST

甚至可以使用 Python 做到这一点吗?

4

3 回答 3

6

这是不可能的。

  • 有许多时区共享相同的偏移量。 有关详细信息,请参阅此 Wikipedia 文章

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

    例如:

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

另请阅读StackOverflow 上时区标签 wiki的“时区!= 偏移量”部分。

于 2013-10-08T17:09:53.960 回答
1

您现在可以获得一组(零个或多个)时区缩写(在tz 数据库中指定)对应于给定的 UTC 偏移量

#!/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'])
于 2015-05-09T11:23:59.653 回答
0

正如马特所说,从偏移量到时区并没有多大意义。

如果您希望为给定的偏移量找到合适的 pytz.timezone 对象:

时区范围从"Etc/GMT-14""Etc/GMT+12"

看看吧pytz.all_timezones

使用这些,我能够使用错误的客户端输入(将时区误认为偏移量)将有效的时区对象附加到我的用户。

于 2015-05-08T16:06:01.037 回答