2012-11-05 53 views
1

我需要一種方法來找出多久一個datetime.time是在另一個datetime.time後很簡單,但...問題是,我的時間值是在24小時的時間,所以它不像從另一個值取消一個值那麼簡單。相反,我需要找出是time_b多久time_a後,如果我是在時間和深夜時段循環輪數着,即計算前進的時間a是多久後的時間b

time_a = 09:00 
time_b = 04:00 

這裏time_b是19小時time_a後

def time_after_time(time_a, time_b): 

    a_hour = time_a.hour 
    a_minute = time_a.minute 
    b_hour = time_b.hour 
    b_minute = time_b.minute 

    out_hour = b_hour - a_hour 
    out_minute = b_minute - a_minute 

    if out_hour < 0: 
     out_hour += 24 

    if out_minute < 0: 
     out_hour -= 1 
     out_minute += 60 

    return datetime.time(out_hour, out_minute) 

這是我的第一次嘗試,但它給出了錯誤的結果。

任何人都可以想到一個更清潔/正確的方法來做到這一點?

+2

爲什麼不使用'datetime.timedelta'? 'time_b - time_a'將產生一個'timedelta'。 –

+0

這適用於datetime.datetime對象,但不適用於datetime。時間對象unfortunatley –

+0

@MartijnPieters它看起來像假設是時間是同一日期...所以,不太清楚預計什麼答案... –

回答

1

這裏是我的解決方案:

def time_after_time(time_a, time_b): 
    time_a_min = time_a.hour * 60 + time_a.minute 
    time_b_min = time_b.hour * 60 + time_b.minute 
    out_min = time_b_min - time_a_min 
    if out_min < 0: 
     out_min += 24 * 60 
    return datetime.time(out_min/60, out_min % 60) 

您可以測試它codepad.org

+0

+1是簡潔的 –

0
timedif = DATETIME_1 - DATETIME_2 
print timedif 

確保您使用datetime.datetime倍......

可以datetime.time轉換爲datetime與

datetime.datetime.combine(datetime.datetime.now().date(),datetimeTime_obj) 

是09:00 - 10:00 = 1小時是25小時嗎?那麼最長24小時呢?

import datetime 

time_a = datetime.time(9,00) 
time_b = datetime.time(5,0) 
dte = datetime.datetime.now().date() 

dt_a = datetime.datetime.combine(dte,time_a) 

dt_b = datetime.datetime.combine(dte,time_b) 
time_dif = dt_b - dt_a 
time_dif2 = dt_a - dt_b 
print "TimeDif:",time_dif,time_dif2 
#output: 20:00:00 , 04:00:00 
0

以我的經驗,這是必要,只要你從外部源接收24小時的基於時間戳,應立即在內部將其轉換爲一個絕對的時間,比如從1970秒。參見例如在C,https://stackoverflow.com/a/12859648/318716中的方式來做到這一點。

一旦你這個,然後簡單的減法時間變得簡單和有效。

如果做到這一點,然後用時間戳48小時不同的問題,最終會出現。

這樣的轉換有時不應該基於當前日期/時間,例如,如果您正在分析歷史存檔數據或回放。

+0

他的時差不應超過23:59小時......根據他的問題陳述 –

+0

@JoranBeasley:也許我是盲人,但在問題陳述中我看不到這一點。如果是這樣,那麼這不會是現實世界的問題。但是,不幸的是***,我也看到了許多不正確的「現實世界」解決方案。這對我建議的解決方案沒有影響。 –

+0

時代應該永遠不會超過23.59 appart,但是我確實沒有明確說明 –

0

第二個答案(我不建議,因爲我的第一個答案中給出的原因)。在C你可以有:

int time1MinusTime2Positive(int t1, int t2) { // returns dt from 0 to <24 hours 
    return fmod(t1 - t2 + 100 * 24 * 60 * 60, 24 * 60 * 60); 
} 

int time1MinusTime2(int t1, int t2) { // returns dt between -12 and +12 hours 
    const int dt = t1 - t2; 
    if (dt > 24 * 60 * 60/2) 
     return dt - 24 * 60 * 60; 
    else if (dt < -24 * 60 * 60/2) 
     return dt + 24 * 60 * 60; 
    else 
     return dt; 
} 

這裏輸入時刻表示爲從午夜秒,秒從1970年或1900年 - 沒關係。相對於當前的午夜,輸出是以秒爲單位的,無論「當前」可能意味着什麼。