Python中如何将带时区的Datetime转换为Epoch时间戳?
嘿,我之前也遇到过一模一样的问题!你的时间字符串带时区偏移(+01:00),这正是直接用普通datetime方法报错的原因——普通的datetime对象是「无时区感知」的,而这种带时区的ISO格式需要特殊处理。下面给你几个靠谱的解决办法:
解决思路与方案
方法一:Python 3.7+ 用自带的fromisoformat(最简单)
这个方法是Python 3.7新增的,专门用来解析ISO 8601格式的时间字符串,包括带时区偏移的版本,完全不用自己写格式串:
from datetime import datetime # 你的时间字符串 dt_str = "2018-02-14T22:15:00.232029+01:00" # 解析为带时区感知的datetime对象 dt = datetime.fromisoformat(dt_str) # 转换为Epoch时间戳(秒数,含小数) epoch_ts = dt.timestamp() print(epoch_ts) # 输出:1518645300.232029
为什么这个能行? 因为fromisoformat会正确识别时区偏移,生成的dt对象是带时区信息的(dt.tzinfo不为None),调用timestamp()时会自动转换为UTC时间再计算Epoch值,结果完全准确。
方法二:低版本Python用python-dateutil库
如果你的Python版本低于3.7,安装python-dateutil库就能轻松解决:
首先安装依赖:
pip install python-dateutil
然后写代码:
from datetime import datetime from dateutil.parser import isoparse dt_str = "2018-02-14T22:15:00.232029+01:00" # isoparse专门解析ISO格式,比通用的parse更高效 dt = isoparse(dt_str) epoch_ts = dt.timestamp() print(epoch_ts)
这个库会智能处理时区偏移,同样生成带时区的datetime对象,转timestamp就不会出错。
为什么你之前的方法会报错?
你用普通datetime.strptime时,大概率是因为格式串没处理好时区部分:strptime的%z指令默认匹配的是不带冒号的时区格式(比如+0100),而你的字符串是+01:00,直接用%Y-%m-%dT%H:%M:%S.%f%z会报错。如果非要用strptime,可以先去掉时区的冒号:
dt_str = "2018-02-14T22:15:00.232029+01:00" # 去掉时区部分的冒号,变成+0100 dt_str_fixed = dt_str[:-3] + dt_str[-2:] dt = datetime.strptime(dt_str_fixed, "%Y-%m-%dT%H:%M:%S.%f%z") epoch_ts = dt.timestamp()
不过这个方法比较繁琐,优先推荐前两种更简洁的方案。
关键提醒:一定要确保你的datetime对象是带时区感知的(dt.tzinfo不为None),否则调用timestamp()时会默认使用本地系统时区,导致结果偏差。
内容的提问来源于stack exchange,提问作者Kon Kyri
相关产品推荐
相关产品推荐

