计算时间差

76

在我的程序开头和结尾,我有以下代码:

from time import strftime
print int(strftime("%Y-%m-%d %H:%M:%S")



Y1=int(strftime("%Y"))
m1=int(strftime("%m"))
d1=int(strftime("%d"))
H1=int(strftime("%H"))
M1=int(strftime("%M"))
S1=int(strftime("%S"))


Y2=int(strftime("%Y"))
m2=int(strftime("%m"))
d2=int(strftime("%d"))
H2=int(strftime("%H"))
M2=int(strftime("%M"))
S2=int(strftime("%S"))

print "Difference is:"+str(Y2-Y1)+":"+str(m2-m1)+":"+str(d2-d1)\
          +" "+str(H2-H1)+":"+str(M2-M1)+":"+str(S2-S1)

但是当我尝试获取时间差时,出现了语法错误...我做错了一些事情,但我不确定发生了什么...

基本上,我只想在我的程序开始时将时间存储在一个变量中,然后在程序接近结束时将第二个时间存储在另一个变量中,然后在程序的最后一部分计算差异并显示它。我并不是在尝试测量函数的速度,而是要记录用户通过一些菜单所需的时间。最好的方法是什么?


3
考虑一下如果用户从8:59:34开始,到9:10:12结束会发生什么。 - John La Rooy
5个回答

138

datetime 模块可以为你完成所有工作:

>>> import datetime
>>> a = datetime.datetime.now()
>>> # ...wait a while...
>>> b = datetime.datetime.now()
>>> print(b-a)
0:03:43.984000

如果您不想显示微秒,只需使用(正如gnibbler建议的那样):

>>> a = datetime.datetime.now().replace(microsecond=0)
>>> b = datetime.datetime.now().replace(microsecond=0)
>>> print(b-a)
0:03:43

1
@gnibbler:嘿,不错。比起搞字符串索引要好得多。 - Tim Pietzcker
你可以使用 c=b-a,str(c) 来获取 '0:03:43' 字符串。 - 未来陆家嘴顶尖的投资人
1
一个缺陷:不使用单调时间。我想当转换到/从夏令时和每当ntpd调整您的时钟时,差异将是错误的。 - user2394284

29
from time import time

start_time = time()
...

end_time = time()
seconds_elapsed = end_time - start_time

hours, rest = divmod(seconds_elapsed, 3600)
minutes, seconds = divmod(rest, 60)

13

你不能单独计算差异...那对于7:59和8:00点会产生什么差异呢?尝试

import time
time.time()

这会给你自纪元开始以来的秒数。

之后你可以用类似下面的代码获取中间时间:

timestamp1 = time.time()
# Your code here
timestamp2 = time.time()
print "This took %.2f seconds" % (timestamp2 - timestamp1)

1
这是最简单的方法。 - Lane

12

time.monotonic()time.monotonic_ns()都是正确的,正确指的是单调性。

>>> import time
>>>
>>> time.monotonic()
452782.067158593
>>>
>>> t0 = time.monotonic()
>>> time.sleep(1)
>>> t1 = time.monotonic()
>>> print(t1 - t0)
1.001658110995777

无论使用何种语言,单调时间都是正确的答案,而真实时间则是错误的答案,用于持续测量不太长的持续时间。单调时间存在的目的是在测量持续时间时提供一致的答案,而真实时间可能会被调整 - 实际上需要被调整 - 以跟上现实。单调时间通常是计算机的正常运行时间。

因此,time.time()datetime.now()都是错误的方法。

Python还有time.perf_counter()time.perf_counter_ns(),它们被指定具有最高可用分辨率,但不能保证是单调的。然而,在PC硬件上,两者通常具有纳秒分辨率。


0
这是一段相关代码:
def(StringChallenge(str1)):
#str1 = str1[1:-1]
h1 = 0
h2 = 0
m1 = 0
m2 = 0

def time_dif(h1,m1,h2,m2):
    if(h1 == h2):
        return m2-m1
    else:
        return ((h2-h1-1)*60 + (60-m1) + m2)
count_min = 0

if str1[1] == ':':
    h1=int(str1[:1])
    m1=int(str1[2:4])
else:
    h1=int(str1[:2])
    m1=int(str1[3:5])

if str1[-7] == '-':
    h2=int(str1[-6])
    m2=int(str1[-4:-2])
else:
    h2=int(str1[-7:-5])
    m2=int(str1[-4:-2])

if h1 == 12:
    h1 = 0
if h2 == 12:
    h2 = 0

if "am" in str1[:8]:
    flag1 = 0
else:
    flag1= 1

if "am" in str1[7:]:
    flag2 = 0
else:
    flag2 = 1

if flag1 == flag2:
    if h2 > h1 or (h2 == h1 and m2 >= m1):
        count_min += time_dif(h1,m1,h2,m2)
    else:
        count_min += 1440 - time_dif(h2,m2,h1,m1)
else:
    count_min += (12-h1-1)*60
    count_min += (60 - m1)
    count_min += (h2*60)+m2


return count_min

1
欢迎来到StackOverflow。虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释,并指出适用的限制和假设。 - Ruli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接