2016-07-01 187 views
0

我在计算时间差异时出现以下错误?如何解决?计算时间差异时出错

from datetime import datetime, date 
import time 
print "Start : %s" % time.ctime() 
start_time = time.ctime() 
#do something 
print "How to calculate time diff?" 
end_time = time.ctime() 
total_elapsed_time = datetime.combine(date.today(), end_time) - datetime.combine(date.today(), start_time) 
print "TOTAL ELAPSED TIME" + str(total_elapsed_time) 

错误: -

Traceback (most recent call last): 
    File "time_diff.py", line 8, in <module> 
    total_elapsed_time = datetime.combine(date.today(), end_time) - datetime.combine(date.today(), start_time) 
TypeError: combine() argument 2 must be datetime.time, not str 
+0

'time.ctime()'返回你字符串'周五05年7月1日: 16:25 2016',你无法计算 –

+0

@RajeshYogeshwar的差异 - 那么,我该如何计算时间差异并以可理解的格式打印? – user2125827

+0

你需要有一个日期时间实例。通过使用日期时间实例,您可以在计算出差异后以人类可读的格式显示它。 –

回答

1

首先你是mixin 3数据类型,所以你的方法根本上是错误的。

有两个(基本)的方法,如何获得和存储时间在Python(两名来自标准库):

  1. 标记 - 导入time模块,然后time.time()将返回一个float - 一些从时代开始秒,那么任何比较就像比较浮点数,如果数字更大 - 那么它代表的是未来的时间,日期之间的任何差异也是一个数字 - 表示日期之间的秒数 - 所以它也是简单的将其转换成分钟,小时等等除以60,3600等。
  2. datetime对象您导入datetime.datetime以获得您可以操作的对象,它比时间戳更容易操作,因为它会自动转换为人类可读格式,所有比较运算符都可以工作,并且日期(日期2 - date1)返回为datetime.timedelta,您可以在其中提取它表示的天数,秒数和毫秒数。

所以在你的代码,你可以使用:

时间戳:

import time 

date1 = time.time() 
print 'Start time: %s' % time.ctime(date1) 
... 
date2 = time.time() 
print 'End time: %s' % time.ctime(date2) 

print 'Time it took: %0.2f seconds' % (date2 - date1) 

日期时间

from datetime import datetime 

date1 = datetime.now() 
print 'Start time: %s' % date1 
... 
date2 = datetime.now() 
print 'End time: %s' % date2 

print 'Time it took: %s' % (date2 - date1) 
0

time.ctime()返回一个字符串,这是你的错误的来源。

See Python time.ctime

了time.time()可能是你在找什么:

See Python ticks

+0

我已经尝试过,使用time.time()抛出'TypeError:combine()参数2必须是datetime.time,而不是float' – user2125827

+0

请参阅http://stackoverflow.com/a/31882919/3900773 – WSimpson

2

错误中明确指出,结合的(参数2)必须是datetime.time。

你应该有datetime.time一个实例是这样的:

d = datetime.now() 
timepart = d.time() 
datepart = d.date() 
datetime.combine(datepart, timepart) 
0

你START_TIME和END_TIME都是字符串。另外你的datetime.combine应该有第二个参数作为一个datetime.time对象。您的time.ctime也会返回日期和年份信息。因此,首先只提取时间信息,然后将其转换为datetime.time对象。

可以使用的ctime存储的开始和结束时间两者结合,然后做这样的事情:

import datetime 
import time 
#store at start time 
a=datetime.datetime.strptime(time.ctime(), "%a %b %d %H:%M:%S %Y") 
#store at end time 
b=datetime.datetime.strptime(time.ctime(), "%a %b %d %H:%M:%S %Y") 
print b-a 

由于@Jerzyk指出,没有必要,除非你想在显示它解析它特定的格式。所以,或者,你可以这样做:

a=datetime.datetime.now() 
b=datetime.datetime.now() 
print b-a 

这将返回一个datetime.timedelta,你可以以结果显示在你所希望的方式解析。

+0

这个解决方案没有任何意义,为什么将时间戳转换为字符串,然后解析它?配对非常昂贵。将时间存储为日期时间或时间戳,然后仅在需要显示时才将其转换,因此它不会被视为解决方案,因为它会吸引新用户使用此类方法 – Jerzyk

+0

您是对的。或者,或者更有效,可以使用datetime.datetime.now()作为开始日期和结束日期,并计算差异。这将返回一个timedelta对象,如果需要的话,该对象可以被格式化为一个字符串。我将编辑我的答案以包含此内容。谢谢 ! – Salander

+0

对于我的强烈评论感到抱歉,但您的解决方案不适用于不同的语言环境 - ctime输出取决于活动语言环境,因此解析模式不匹配,唯一正确执行此操作的方法是使用时间戳或日期时间对象。 – Jerzyk

1
from datetime import datetime, timedelta 

def calc(): 
    s = datetime.now() 
    e = datetime(day=21, month=7, year=2016, hour=12, minute=0) 

    diff = e - s 

差异是datetime.timedelta实例现在。在此实例中,您可以使用名称为total_seconds的属性,如天,秒,微秒和函数。

PS:此处仅供参考。我希望它有助于实现一个解决方案