You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:05:33