如何将位置时区的文本描述传送到基于 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
我需要能够将存储为基于区域的字符串的时区转换为 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