如何将UTC偏移时区信息转换为Pytz的时区名称?
问题描述
我有一个datetime字符串示例:date = "2023-06-16T07:46:00-03:00"
提取其时区信息后得到以下结果:
>>> formatted_date = datetime.strptime(date, "%Y-%m-%dT%H:%M:%S%z") >>> formatted_date.tzinfo datetime.timezone(datetime.timedelta(days=-1, seconds=75600)) >>> formatted_date.tzinfo.tzname(formatted_date) 'UTC-03:00'
我需要将该时区信息转换为America/Los_Angeles这类格式,以用于PostgreSQL的EXTRACT函数。请问是否有工具包或Pytz中的函数可实现此转换?
解决方案
直接通过时区偏移量转换为IANA时区名称存在歧义——因为多个不同的IANA时区可能对应同一个UTC偏移量(比如部分地区夏令时切换后,不同时段会出现相同偏移量但时区名称不同的情况)。不过可以借助第三方库实现近似匹配:
方法1:使用pytz库
遍历pytz内置的所有IANA时区,对比目标时间在对应时区下的偏移量,找到匹配项:
from datetime import datetime import pytz date_str = "2023-06-16T07:46:00-03:00" formatted_date = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S%z") target_offset = formatted_date.utcoffset() # 筛选匹配偏移量的时区 matching_timezones = [] for tz_name in pytz.all_timezones: tz = pytz.timezone(tz_name) # 用目标日期计算时区偏移量,规避夏令时影响 current_offset = tz.utcoffset(formatted_date.replace(tzinfo=None)) if current_offset == target_offset: matching_timezones.append(tz_name) print(matching_timezones) # 输出示例:['America/Argentina/Buenos_Aires', 'America/Argentina/Cordoba', 'America/Argentina/Tucuman', ...]
方法2:使用python-dateutil库
dateutil的tz模块可反向匹配偏移量对应的时区,同样会返回多个可能结果:
from datetime import datetime from dateutil import tz date_str = "2023-06-16T07:46:00-03:00" formatted_date = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S%z") target_offset = formatted_date.utcoffset() # 获取所有可用时区并匹配 possible_zones = list(tz.gettz_set()) matching_zones = [tz_obj for tz_obj in possible_zones if tz_obj.utcoffset(formatted_date) == target_offset] matching_tz_names = [tz_obj.tzname(formatted_date) for tz_obj in matching_zones] print(matching_tz_names)
关键提醒
- 一个UTC偏移量对应多个IANA时区是常态,无法直接得到唯一结果,需要结合业务场景(比如限定地区)筛选最终时区。
- 如果数据源能提供额外地域信息,优先用地域信息缩小范围,避免匹配错误。
内容的提问来源于stack exchange,提问作者andrepz
相关产品推荐
相关产品推荐

