Python使用strftime将秒数转为%H:%M:%S.%f格式时%f占位符不生效
问题原因
time.strftime()依赖操作系统原生C库的strftime实现,绝大多数平台的原生实现不支持%f微秒/毫秒占位符,所以代码中写的%f会被当成普通字符串直接输出,最终得到06:08:04.%f的结果。
解决方案
方案1:使用datetime模块(推荐)
datetime模块的strftime是Python独立实现的,不依赖系统底层能力,原生支持%f微秒占位符。注意%f默认输出6位微秒,要得到3位毫秒格式,直接截取字符串后3位即可。
from datetime import datetime # 如果是pcap等场景返回的timeval结构(同时包含tv_sec秒、tv_usec微秒字段) total_ts = pkt_time_cap.tv_sec + pkt_time_cap.tv_usec / 1_000_000 # 转成本地时间后格式化,[:-3]切掉最后3位微秒,得到3位毫秒 time_cap = datetime.fromtimestamp(total_ts).strftime('%H:%M:%S.%f')[:-3] print(time_cap)
如果时间戳只有整数秒、没有毫秒精度,直接传入pkt_time_cap.tv_sec即可,输出的毫秒位会自动补为000。如果需要UTC时间,把fromtimestamp替换为utcfromtimestamp即可。
方案2:手动拼接毫秒段(兼容time模块使用场景)
如果必须沿用time模块的逻辑,可以单独计算毫秒值,和time.strftime生成的时分秒字符串手动拼接:
import time time_struct = time.localtime(pkt_time_cap.tv_sec) # 有微秒字段就换算成3位毫秒,没有就补0 ms = int(pkt_time_cap.tv_usec / 1000) if hasattr(pkt_time_cap, 'tv_usec') else 0 time_cap = f"{time.strftime('%H:%M:%S', time_struct)}.{ms:03d}" print(time_cap)
如果需要UTC时间,把localtime替换为gmtime即可。
内容的提问来源于stack exchange,提问作者D-LA
相关产品推荐
相关产品推荐

