解决Python中datetime对象无tz_localize属性的AttributeError问题
UTC转PST时间函数报错排查与解决
问题描述
编写Python函数将UTC时间转换为PST时间并计算查询起止时间时,持续报错:AttributeError: 'datetime.datetime' object has no attribute 'tz_localize'
函数代码
def get_start_and_end_pst_dates(date_min_utc, date_max_utc): date_min_pst=date_min_utc.tz_localize('UTC').astimezone(pytz.timezone('America/Los_Angeles')) date_max_pst=date_max_utc.tz_localize('UTC').astimezone(pytz.timezone('America/Los_Angeles')) day_start_str=str(date_min_pst)[:-6] day_end_str=str(date_max_pst)[:-6] day_end=datetime.strptime(day_end_str, '%Y-%m-%d %H:%M:%S') day_start=datetime.strptime(day_start_str, '%Y-%m-%d %H:%M:%S') query_datetime = day_end + timedelta(hours=1) query_date_end = query_datetime.strftime('%Y-%m-%d %H:%M:%S') query_datetime = day_start - timedelta(hours=1) query_date_start=query_datetime.strftime('%Y-%m-%d %H:%M:%S') return query_date_start,query_date_end
输入示例
datetime_str_start = '09/19/18 13:55:26' datetime_str_end = '09/19/18 14:55:26' datetime_object_start = datetime.strptime(datetime_str_start, '%m/%d/%y %H:%M:%S') datetime_object_end = datetime.strptime(datetime_str_end, '%m/%d/%y %H:%M:%S') a,b = get_start_and_end_pst_dates(datetime_object_start,datetime_object_end)
问题原因
tz_localize是pytz库为时区感知datetime对象提供的扩展方法,但你传入的date_min_utc和date_max_utc是原生的无时区信息datetime对象,原生datetime类没有这个方法。- 代码存在冗余操作:将带时区的datetime转换为字符串,再解析回无时区datetime,完全没必要,还会丢失时区信息。
修复方案
方案1:使用pytz正确处理时区
先给无时区的UTC时间添加时区标记,再转换到PST,同时简化时间计算逻辑:
import datetime import pytz def get_start_and_end_pst_dates(date_min_utc, date_max_utc): # 给UTC时间添加时区信息 utc_tz = pytz.UTC date_min_utc_aware = utc_tz.localize(date_min_utc) date_max_utc_aware = utc_tz.localize(date_max_utc) # 转换为PST时区 pst_tz = pytz.timezone('America/Los_Angeles') date_min_pst = date_min_utc_aware.astimezone(pst_tz) date_max_pst = date_max_utc_aware.astimezone(pst_tz) # 直接对时区感知的datetime进行计算,无需字符串转换 query_date_end = (date_max_pst + datetime.timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S') query_date_start = (date_min_pst - datetime.timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S') return query_date_start, query_date_end
方案2:使用Python 3.9+标准库zoneinfo(推荐)
如果你的Python版本≥3.9,无需安装第三方库,用zoneinfo更简洁:
import datetime from zoneinfo import ZoneInfo def get_start_and_end_pst_dates(date_min_utc, date_max_utc): # 为UTC时间添加时区信息 date_min_utc_aware = date_min_utc.replace(tzinfo=ZoneInfo('UTC')) date_max_utc_aware = date_max_utc.replace(tzinfo=ZoneInfo('UTC')) # 转换为PST时区 date_min_pst = date_min_utc_aware.astimezone(ZoneInfo('America/Los_Angeles')) date_max_pst = date_max_utc_aware.astimezone(ZoneInfo('America/Los_Angeles')) # 计算并格式化结果 query_date_end = (date_max_pst + datetime.timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S') query_date_start = (date_min_pst - datetime.timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S') return query_date_start, query_date_end
验证调用
保持原输入代码不变,调用修复后的函数即可正常运行,示例输出:
2018-09-19 05:55:26 2018-09-19 07:55:26
内容的提问来源于stack exchange,提问作者Ramish
相关产品推荐
相关产品推荐

