Python 将带指定时区的时间字符串转换为 UTC 时间的实现
时区时间转换为UTC时间的正确实现
原代码的逻辑存在错误:通过datetime.datetime.strptime解析得到的是不带时区标识的 naive 时间对象,直接调用astimezone方法时,Python会默认把该时间识别为代码运行设备的本地时区,再转换到你指定的目标时区,完全不符合「scheduleDate是对应timezone时区下的时间」的需求,输出结果不符合预期。
基于pytz的修正代码
import datetime import pytz timezone = "America/New_York" scheduleDate = "2021-09-21 21:00:00" # 解析得到无时区信息的基础时间对象 naive_dt = datetime.datetime.strptime(scheduleDate, '%Y-%m-%d %H:%M:%S') # 给基础时间绑定指定的时区信息,生成带时区标识的时间对象 local_aware_dt = pytz.timezone(timezone).localize(naive_dt) # 直接转换为UTC时区时间 utc_dt = local_aware_dt.astimezone(datetime.timezone.utc) # 格式化输出 sdate = utc_dt.strftime('%Y-%m-%dT%H:%M:%SZ') print(sdate)
以上代码输出结果为2021-09-22T01:00:00Z,符合2021年9月纽约夏令时比UTC晚4小时的换算规则。
Python 3.9+ 标准库实现(无需安装pytz)
import datetime from zoneinfo import ZoneInfo timezone = "America/New_York" scheduleDate = "2021-09-21 21:00:00" naive_dt = datetime.datetime.strptime(scheduleDate, '%Y-%m-%d %H:%M:%S') local_aware_dt = naive_dt.replace(tzinfo=ZoneInfo(timezone)) utc_dt = local_aware_dt.astimezone(datetime.timezone.utc) sdate = utc_dt.strftime('%Y-%m-%dT%H:%M:%SZ') print(sdate)
注意事项
- 无需通过时间戳中转实现时区转换,多步中转容易引入额外误差,直接调用
astimezone转换带时区标识的时间对象更可靠 - 遇到夏令时切换区间的模糊时间,可通过pytz的
localize方法传入is_dst参数指定处理逻辑,避免转换报错
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

