来自 UTC 偏移的 Pytz 时区

Posted

技术标签:

【中文标题】来自 UTC 偏移的 Pytz 时区【英文标题】:Pytz Timezone from UTC offset 【发布时间】:2018-02-12 16:31:38 【问题描述】:

我在 Python 中使用 Facebook 的图形 API。对于任何user_id,它将用户的时区作为一个浮点数给出,表示与UTC的偏移量。

示例:对于印度的某人,它给出 5.5

如何将其转换为有效的timezone,例如Asia/Kolkata

我查看了pytz,但没有找到任何合适的方法。

【问题讨论】:

除非您也有位置,否则这没有什么意义 - 对于大多数偏移量来说,有多个时区。 可以有多个时区使用相同的偏移量。您能做的最好的事情就是获取可能的时区列表:***.com/a/44811038/7605325 我知道。但这是我可以忍受的缺点。 【参考方案1】:

通过查看所有条目,您可以找到与 Olson 数据库中最后一个条目的给定偏移量(忽略 DST)匹配的所有时区。

代码:

import datetime as dt
import pytz

def possible_timezones(tz_offset, common_only=True):
    # pick one of the timezone collections
    timezones = pytz.common_timezones if common_only else pytz.all_timezones

    # convert the float hours offset to a timedelta
    offset_days, offset_seconds = 0, int(tz_offset * 3600)
    if offset_seconds < 0:
        offset_days = -1
        offset_seconds += 24 * 3600
    desired_delta = dt.timedelta(offset_days, offset_seconds)

    # Loop through the timezones and find any with matching offsets
    null_delta = dt.timedelta(0, 0)
    results = []
    for tz_name in timezones:
        tz = pytz.timezone(tz_name)
        non_dst_offset = getattr(tz, '_transition_info', [[null_delta]])[-1]
        if desired_delta == non_dst_offset[0]:
            results.append(tz_name)

    return results

测试代码:

print(possible_timezones(5.5, common_only=False))

结果:

['Asia/Calcutta', 'Asia/Colombo', 'Asia/Kolkata']

【讨论】:

以上是关于来自 UTC 偏移的 Pytz 时区的主要内容,如果未能解决你的问题,请参考以下文章

pytz 时区的 STD 偏移量

使用 pytz 从 UTC 偏移“规范”?

Python & pytz:确定时区是不是支持 DST 以及 DST 和非 DST UTC 偏移量是多少

Python pytz 时区转换返回的值与不同日期的时区偏移量不同

给定 UTC 时间戳和 UTC 偏移量,是不是可以在 Python 中获取时区?

如何从 UTC 的偏移量(毫秒?