使用timedelta计算两个ISO8601格式时间的时间差
解决ISO8601时间差值计算(精确到毫秒)问题
首先,咱们先揪出你代码里的关键小错误:strptime的格式字符串里重复写了多次%f,这完全没必要——%f本身就专门用来匹配ISO8601时间里的6位微秒数(比如251537),所以正确的格式应该是'%Y-%m-%dT%H:%M:%S.%f',不需要重复写%f。
再看你的实际代码,我帮你修正并优化,同时实现精确到毫秒的差值计算:
修正后的完整代码
import datetime command = "NAME,COMMAND,2018-05-10T18:31:30.515276" command_lis = command.replace("\n"," ").split(",") # 这里你原来写的是/n,应该是\n哦 print("Received the following time: " + command_lis[2]) # 直接获取当前UTC时间,不用转成字符串再解析,多此一举啦 a = datetime.datetime.utcnow() print("a is set") # 用正确的格式解析命令里的ISO8601时间 b = datetime.datetime.strptime(command_lis[2], '%Y-%m-%dT%H:%M:%S.%f') print("b is set") # 计算时间差,直接用datetime对象相减就行 delta = b - a print("原始时间差:", delta) # 方式1:输出精确到毫秒的秒数(保留3位小数) total_seconds_ms = delta.total_seconds() print(f"精确到毫秒的差值(秒): {total_seconds_ms:.3f}") # 方式2:输出时分秒格式的毫秒级差值 # 把微秒转成毫秒,补零到3位保证格式统一 hours = delta.seconds // 3600 minutes = (delta.seconds % 3600) // 60 seconds = delta.seconds % 60 milliseconds = delta.microseconds // 1000 delta_ms_str = f"{delta.days} days, {hours}:{minutes:02d}:{seconds:02d}.{milliseconds:03d}" print(f"精确到毫秒的差值(时分秒格式): {delta_ms_str}")
关键细节说明
- 避免多余转换:你原来把
utcnow()转成isoformat()再解析,完全没必要,直接用datetime.utcnow()就能拿到datetime对象,效率更高。 - 正确解析ISO8601:
%Y-%m-%dT%H:%M:%S.%f完美适配带6位微秒的ISO8601格式,哪怕字符串里的微秒只有3位(比如.515),%f也会自动补零识别成515000微秒。 - 毫秒精度的两种实现:
- 要是需要数值形式的结果,用
total_seconds()拿到总秒数后,用.3f格式化就能保留到毫秒位。 - 要是需要可读性强的时分秒格式,把微秒除以1000得到毫秒数,再补零到3位,拼接成标准格式即可。
- 要是需要数值形式的结果,用
如果之后你需要保留ISO8601标准的6位微秒精度,直接调用delta.microseconds就能拿到完整的6位数值哦。
内容的提问来源于stack exchange,提问作者user2341830
相关产品推荐
相关产品推荐

