计算时差Python

时间:2014-08-03 10:21:55

标签: python datetime math difference

我试图计算两个24小时格式时间之间的小时和分钟差异。 我似乎无法找到或让我的代码以相同的小时值工作两次,例如13:32和13:36,它在计算具有不同hr值的时间时工作正常。如果可能的话,我不想使用date.time模块,可以假设第二次比第一次更晚。

time1hr= 13
time1min= 32
time2hr= 13
time2min= 36

min_diff= 60 - time1min + time2min
hour_diff= abs(time2hr - time1hr) -1 

3 个答案:

答案 0 :(得分:1)

首先,您无法通过添加来计算差异,但这正是您在此尝试做的事情:

min_diff= 60 - time1min + time2min

另外,如果你可以假设time2晚于time2,为什么你在这里使用abs

hour_diff= abs(time2hr - time1hr) -1 

最后,您要向min_diff添加60并从hour_diff减去1。如果min_diff溢出为负面,那显然是正确的做法。但只有当time1min大于time2min时才会发生这种情况,而不是每次都发生。 (当然,只有当你减去而不是增加时。)你确实需要处理这个 - 只是因为你可以假设第二次比第一次更晚并不意味着你可以假设第二次#s分钟比第一分钟高 - 但你只有在它发生的时候才需要处理它,否则你最终会得到诸如" -1小时,+ 37分钟和#34;之类的东西。而不是" -43分钟"。

所以,从这开始:

min_diff = time2min - time1min
hour_diff = time2hr - time1hr
if min_diff < 0:
    min_diff += 60
    hour_diff -= 1

如果你看一下,你应该意识到它与你在小学中减去2位或更多位数的方法完全一样,除了你必须携带60,而不是10。通过,看看你是否可以提出可能棘手的测试用例。


如果由于某种原因您不允许使用if声明怎么办?

显然你可以把它变成while声明;只要输入值有效,它就会运行&#34;循环&#34; 0次或1次,效果与if完全相同,但这可能是作弊。或者你可以使用三元if表达而不是if语句,但这也可能是作弊。

但更聪明的解决方案是使用除法和余数来进行携带。 45/60为0,其中45为剩余,但-15/60为-1,其中45为剩余。*所以:

carry, min_diff = divmod(time2min - time1min, 60)
hour_diff = time2hr - time1hr + carry * 60

我认为这可能过于聪明和棘手,但你的里程可能会有所不同。


*当涉及负数时,并非所有语言都以相同的方式定义除法和余数。在Python中,除法总是向下舍入,所以你得到-1而剩下的45,但是在C中,除法总是向0舍入,所以你得到0而剩下-15,这根本不会帮助我们。幸运的是,我们使用的是Python,而不是C。

答案 1 :(得分:0)

OP出于一些不明原因要求提供一个不使用datetime模块且没有if语句的解决方案。

一种可能性是将时间转换为分钟。或者甚至是我的例子中的秒数:

def time_diff(t1, t2):
  h1, m1, s1 = t1
  h2, m2, s2 = t2
  s1 = h1 * 3600 + m1 * 60 + s1
  s2 = h2 * 3600 + m2 * 60 + s2
  diff = abs(s2 - s1)
  h_diff = int(diff / 3600)
  m_diff = int((diff % 3600) / 60)
  s_diff = diff % 60
  return (h_diff, m_diff, s_diff)

time1hr = 13
time1min = 32
time2hr = 13
time2min = 36
h_diff, m_diff, _ = time_diff((time1hr, time1min, 0), (time2hr, time2min, 0))
print("Diff in hh:mm is {0:02}:{1:02}.".format(h_diff, m_diff))
# Diff in hh:mm is 00:04.

答案 2 :(得分:0)

两个日期时间对象之间的区别是一个timelta对象,它有多种方法可以区别对待。