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

使用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}")

关键细节说明

  1. 避免多余转换:你原来把utcnow()转成isoformat()再解析,完全没必要,直接用datetime.utcnow()就能拿到datetime对象,效率更高。
  2. 正确解析ISO8601:%Y-%m-%dT%H:%M:%S.%f完美适配带6位微秒的ISO8601格式,哪怕字符串里的微秒只有3位(比如.515),%f也会自动补零识别成515000微秒。
  3. 毫秒精度的两种实现:
    • 要是需要数值形式的结果,用total_seconds()拿到总秒数后,用.3f格式化就能保留到毫秒位。
    • 要是需要可读性强的时分秒格式,把微秒除以1000得到毫秒数,再补零到3位,拼接成标准格式即可。

如果之后你需要保留ISO8601标准的6位微秒精度,直接调用delta.microseconds就能拿到完整的6位数值哦。

内容的提问来源于stack exchange,提问作者user2341830

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:43:52