如何将位置时区的文本描述传送到基于 Python 的 UTC?

How can I convey text descriptions of location time zones to UTC based in Python?

我需要能够将存储为基于区域的字符串的时区转换为 UTC 时区或跨位置的通用时区。例如,“Canada/Vancouver”和“Americas/Los_Angeles”都应解析为“US/Pacific”。此解决方案也适用于其他时区,如“Canada/Toronto”和“AmericA/New_York”到“US/Eastern”,也适用于墨西哥等其他地区的时区

我不知道该怎么做,甚至想都没想过。我可以将它转换为 UTC-7,但不能处理 PST 与 PDT 的转换。

有人可以帮忙吗?

编辑:看完评论和回答后,我意识到我的问题不够清楚。 我有一组 phone 数字,我使用“phonenumbers”包以每个数字的较新格式获取时区,但我想计算唯一 phone 旧地区时区命名约定的数字。因此,我想将较新的“Continent/City”时区转换为“Country/Region”时区。 . UTC 只是我想办法将 region/city 格式转换为通用名称。

time zones as from the IANA database指的是地理意义上的区域。另一方面,UTC 不是时区,它是 通用 (不特定于某个区域)。

  • 对于时区,您可以有一个与 UTC 的偏移量(例如 UTC-8 比 UTC 晚 8 小时)。
  • 给定时区中的某个 date/time 具有特定的 UTC 偏移量,源自该时区的规则(何时应用 DST 等)。
  • 反过来,某个 UTC 偏移量可以在给定 date/time 的 多个 时区中应用,因此映射回需要一个定义,否则它是模棱两可的。

关于时区的命名,首选“Continent/City”式的时区名称。像“US/Pacific”这样的旧名称(从 1993 年开始)保留在数据库中以实现向后兼容性 - 另请参阅 eggert-tz/backward.

Python >= 3.9 通过 zoneinfo 模块支持标准库的 IANA 时区。使用它,您可以轻松创建感知日期时间对象并获取它们的 UTC 偏移量,例如喜欢

from datetime import datetime
from zoneinfo import ZoneInfo

tznames = ["America/Vancouver", "America/Los_Angeles",
           "America/Toronto", "America/New_York", "Europe/Berlin"]

def timedelta_to_str(td):
    hours, seconds = divmod(td.total_seconds(), 3600)
    return f"{int(hours):+}:{int(seconds/60):02d}"

now = datetime.now().replace(microsecond=0)

for z in tznames:
    local_now = now.astimezone(ZoneInfo(z))
    print(f"now in zone {z}:\n\t{local_now.isoformat(' ', timespec='seconds')}, "
          f"UTC offset: {timedelta_to_str(local_now.utcoffset())} hours\n")
    # or also e.g. print(f"local time {z}:\n\t{local_now}, UTC offset: {local_now.strftime('%z')}\n")

# now in zone America/Vancouver:
#   2022-01-12 06:30:08-08:00, UTC offset: -08:00 hours

# now in zone America/Los_Angeles:
#   2022-01-12 06:30:08-08:00, UTC offset: -08:00 hours

# now in zone America/Toronto:
#   2022-01-12 09:30:08-05:00, UTC offset: -05:00 hours

# now in zone America/New_York:
#   2022-01-12 09:30:08-05:00, UTC offset: -05:00 hours

# now in zone Europe/Berlin:
#   2022-01-12 15:30:08+01:00, UTC offset: +01:00 hours

另见 SO:

  • Python: datetime tzinfo time zone names documentation
  • Display the time in a different time zone
  • Format timedelta to string