Python - 给定时间戳UTC和UTC偏移量的时区名称

Posted

技术标签:

【中文标题】Python - 给定时间戳UTC和UTC偏移量的时区名称【英文标题】:Python - Timezone name given timestamp UTC and UTC offset 【发布时间】:2016-09-05 20:03:56 【问题描述】:

我正在尝试构建如下函数:

输入

UTC 时间戳,以毫秒为单位,例如:

1456865863633

UTC 偏移量,或毫秒加/减 UTC 时间戳以获得相应时区的时间,例如:

-14400

输出 时区名称,格式如下:

US/Alaska
US/Aleutian
US/Arizona
US/Central
US/East-Indiana
US/Eastern
US/Hawaii
.
.
.

我一直在尝试使用 datetimepytz 库找到合适的组合,但到目前为止我还没有成功。

有什么想法吗?

【问题讨论】:

许多时区具有相同的 UTC 偏移量,这使得从一个时区到另一个时区很容易,但不是从一个时区到另一个时区。当为给定的偏移量找到多个时区时,您希望采取什么行为? 我想知道世界上哪些地区与 UTC 的给定偏移量相对应,所以我想检索列表中所有可用的时区名称。 酷,那么 unutbu 的答案看起来不错。 相关:pytz: return Olson Timezone name from only a GMT Offset 【参考方案1】:

这是与@unutbu's answer 不同的方法实现:

from datetime import datetime
import pytz

def timezones_from_utc_offset(offset, now=None):
    if now is None:
        now = datetime.now(pytz.utc)
    return tz.zone for tz in map(pytz.timezone, pytz.all_timezones_set)
            if now.astimezone(tz).utcoffset() == offset

如果输入是以毫秒为单位的 POSIX 时间:

>>> from datetime import timedelta
>>> dt = datetime(1970,1,1,tzinfo=pytz.utc) + timedelta(milliseconds=1456865863633)
>>> timezones_from_utc_offset(offset=timedelta(seconds=-14400), now=dt)
'America/Anguilla',
 'America/Antigua',
 'America/Aruba',
 'America/Barbados',
 'America/Blanc-Sablon',
 'America/Boa_Vista',
 'America/Campo_Grande',
 'America/Cuiaba',
 'America/Curacao',
 'America/Dominica',
 'America/Glace_Bay',
 'America/Goose_Bay',
 'America/Grand_Turk',
 'America/Grenada',
 'America/Guadeloupe',
 'America/Guyana',
 'America/Halifax',
 'America/Kralendijk',
 'America/La_Paz',
 'America/Lower_Princes',
 'America/Manaus',
 'America/Marigot',
 'America/Martinique',
 'America/Moncton',
 'America/Montserrat',
 'America/Port_of_Spain',
 'America/Porto_Velho',
 'America/Puerto_Rico',
 'America/Santo_Domingo',
 'America/St_Barthelemy',
 'America/St_Kitts',
 'America/St_Lucia',
 'America/St_Thomas',
 'America/St_Vincent',
 'America/Thule',
 'America/Tortola',
 'America/Virgin',
 'Atlantic/Bermuda',
 'Brazil/West',
 'Canada/Atlantic',
 'Etc/GMT+4'

【讨论】:

【参考方案2】:

你可以遍历所有的时区

for name in pytz.all_timezones:

并将日期的 utcoffset 与给定的偏移量进行比较:

if date.utcoffset().total_seconds() == utcoffset:
    result.append(name)

import datetime as DT
import pytz
utc = pytz.utc
def tzones(timestamp, utcoffset):
    result = []
    date = utc.localize(DT.datetime.utcfromtimestamp(timestamp/float(1000)))
    for name in pytz.all_timezones:
        timezone = pytz.timezone(name)
        date = date.astimezone(timezone)
        if date.utcoffset().total_seconds() == utcoffset:
            result.append(name)
    return result

print(tzones(1456865863633, -14400))

打印

['America/Anguilla', 'America/Antigua', 'America/Aruba', 'America/Barbados', 'America/Blanc-Sablon', 'America/Boa_Vista', 'America/Campo_Grande', 'America/Cuiaba', 'America/Curacao', 'America/Dominica', 'America/Glace_Bay', 'America/Goose_Bay', 'America/Grand_Turk', 'America/Grenada', 'America/Guadeloupe', 'America/Guyana', 'America/Halifax', 'America/Kralendijk', 'America/La_Paz', 'America/Lower_Princes', 'America/Manaus', 'America/Marigot', 'America/Martinique', 'America/Moncton', 'America/Montserrat', 'America/Port_of_Spain', 'America/Porto_Velho', 'America/Puerto_Rico', 'America/Santo_Domingo', 'America/St_Barthelemy', 'America/St_Kitts', 'America/St_Lucia', 'America/St_Thomas', 'America/St_Vincent', 'America/Thule', 'America/Tortola', 'America/Virgin', 'Atlantic/Bermuda', 'Brazil/West', 'Canada/Atlantic', 'Etc/GMT+4']

【讨论】:

以上是关于Python - 给定时间戳UTC和UTC偏移量的时区名称的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 python 和 django 中使用 Pytz 根据给定的 UTC 偏移量转换数据和时间?

Python 中给定 TimeZone 的标准 UTC 偏移量(无 DST)

ruby 获取给定时区的时间

JS:如何获取时区

Unix 纪元时间戳在 Python 中转换为 UTC 时区