2016-07-01 183 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:此處僅供參考。我希望它有助於實現一個解決方案