我的数据库中有用户的 UTC 偏移量:
+5:30
如何使用 Python 从此 UTC 偏移量中获取时区缩写?
如
+5:30 => IST
甚至可以使用Python来做到这一点吗?
是不可能的。
有许多时区共享相同的偏移量。 有关详细信息,请参阅此维基百科文章。
时区缩写没有统一的标准。 这里和这里列出了一些,你可以看到两个方向都有重复项。
例如:
- CST 可能是 -5:00、-6:00、+
- 8:00、+9:30 或 +10:30。
- -10:00 可以是 HST、HAST、TAHT 或 CKT
另请阅读时区标签wiki的"时区!=偏移量"部分 在StackOverflow上。
您现在可以获得一组(零个或多个)时区缩写(如 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'])
<</div>
div class="one_answers"> 正如 Matt 所说,从偏移量到时区没有多大意义。
如果您希望为给定偏移量找到合适的 pytz.timezone 对象:
时区范围从"Etc/GMT-14"
到"Etc/GMT+12"
看看pytz.all_timezones
.
使用这些,我能够使用错误的客户端输入(将时区误认为偏移量)将有效的时区对象附加到我的用户。