我正在使用 datetime.timedelta 来获取python中进程的持续时间。
def get_time_difference(start_time, end_time):
time_in_seconds = (end_time - start_time)
return str(datetime.timedelta(seconds=time_in_seconds))[:-3]
文档指出“所有参数都是可选的,默认为0。参数可以是整数或浮点数,并且可以是正数或负面。” 因此,以下两个示例应返回正的持续时间:
result = irf.get_time_difference(2965.1000488281256, 3020.5600097656256)
print(result)
result = irf.get_time_difference(5905.099804687499, 5961.099804687499)
print(result)
结果:
55.4599609375 <- this is the time_in_seconds
0:00:55.459
56.0 <- this is the time_in_seconds
0:00
第二个示例是错误的 - 时间差不为零。 如果我手动将 0.01 添加到以秒为单位的时间中,我会得到:
56.01
0:00:56.010
我什至尝试过该函数的这种变体,其中我将浮点数拆分为秒和毫秒:
time_in_seconds = (end_time - start_time)
secs, millis = divmod(time_in_seconds, 1)
print(f"TiS {time_in_seconds} = S {secs} & MS {millis}")
return str(datetime.timedelta(seconds=int(secs), milliseconds=millis))[:-3]
哪个输出
TiS 55.4599609375 = S 55.0 & MS 0.4599609375
0:00:55.000
TiS 56.0 = S 56.0 & MS 0.0
0:00
为什么会产生 .0 结果输出不正确? 谢谢。
问题在于在创建
timedelta
对象时将
seconds
参数强制转换为整数:
return str(datetime.timedelta(seconds=int(secs), milliseconds=millis))[:-3]
当将
secs
传递给
int()
时,将截断任何小数部分,从而导致时间差不正确。在第二个示例中,
secs
为 56.0,转换为整数变为 56,从而有效地消除了小数秒。
要解决此问题,应该将
总秒数
传递给
timedelta
构造函数,让它处理秒和毫秒之间的转换:
def get_time_difference(start_time, end_time):
time_in_seconds = (end_time - start_time)
return str(datetime.timedelta(seconds=time_in_seconds))[:-3]
这将确保正确表示时间差,包括小数秒。
以下是的示例的更正版本:
import datetime
def get_time_difference(start_time, end_time):
time_in_seconds = (end_time - start_time)
return str(datetime.timedelta(seconds=time_in_seconds))[:-3]
result = get_time_difference(2965.1000488281256, 3020.5600097656256)
print(result) # 输出:0:00:55.459
result = get_time_difference(5905.099804687499, 5961.099804687499)
print(result) # 输出:0:00:56.000
标签:python
From: 78800801