带时区的Datetime对象转分钟遇格式错误,求高效实现方案
解决带时区偏移的Datetime解析与分钟数转换问题
哦,我完全懂你碰到的坑!你的问题出在格式字符串的时区占位符用错了,接下来我给你拆解问题,再讲讲高效的实现方法。
首先修正解析错误
你用的%Z是用来匹配时区名称的(比如UTC、CST、GMT这种),但你的时间字符串里是+08:00这种时区偏移量,得用小写的%z才行!而且格式里不需要单独写+,%z会自动匹配+hh:mm或-hh:mm的格式。
修正后的解析代码:
import datetime # 注意这里用%z替代%Z,并且去掉多余的+ fmt = '%Y-%m-%d %H:%M:%S.%f%z' d1 = datetime.datetime.strptime('2018-05-13 11:40:38.695000+08:00', fmt)
更高效的解析方式(Python 3.7+)
如果你用的是Python 3.7及以上版本,完全不用手写格式字符串,直接用fromisoformat()方法——它原生支持这种带时区偏移的ISO标准时间格式,既高效又不容易出错:
d1 = datetime.datetime.fromisoformat('2018-05-13 11:40:38.695000+08:00')
转换为分钟数的两种常见场景
1. 转换为从Epoch时间(1970-01-01 UTC)开始的总分钟数
如果是要和其他基于Epoch的时间数据比较,先转成timestamp(秒级,带小数精度)再除以60即可:
total_minutes = d1.timestamp() / 60 print(total_minutes) # 输出类似 25277964.644916667
2. 和另一个Datetime对象计算分钟差
如果是要和另一个带时区的Datetime比较,直接计算时间差再转成分钟:
# 示例:创建另一个同时区的Datetime对象 d2 = datetime.datetime(2018, 5, 13, 10, 0, tzinfo=datetime.timezone(datetime.timedelta(hours=8))) time_delta = d1 - d2 minutes_diff = time_delta.total_seconds() / 60 print(minutes_diff) # 输出约100.644916667
总结你遗漏的要点
%Zvs%z:前者匹配时区名称,后者匹配时区偏移量,你的场景必须用%z- Python 3.7+的
fromisoformat()是解析ISO格式时间的最优解,不用手动写格式字符串 - 转分钟数时,根据你的比较场景选择基于Epoch的总分钟数,或是两个时间的差值分钟数
内容的提问来源于stack exchange,提问作者Lee Merlas
相关产品推荐
相关产品推荐

