2014-10-17 166 views
0

如何計算兩次紅寶石之間的差異?兩次之間的差異

例如:

我有這個時間作爲字符串

time1 = '08:00' 
time2 = '12:00' 

讓我們考慮時間1爲正,時間2負(這樣想工作一小時,我一天上班8小時,另一天我錯過12小時),我願做這樣的事情:

diff = Time.parse(time1) - Time.parse(time2) 
Time.at(diff).gmtime.strftime('%H:%M') 
# expect to get something like "-04:00" 
# but the result is "20:00" 
+0

你所說的 「時間1爲正,時間2負」 呢? – sawa 2014-10-17 11:21:50

+0

想象一下工作時間,一天工作8小時,另一天我錯過了12小時,現在很清楚? – brunozrk 2014-10-17 11:24:05

+0

您可能會發現我編寫的這個課程很有幫助:https://github.com/SKoschnicke/timespan/blob/master/time_of_day.rb – 2014-10-17 11:45:16

回答

1

要了解什麼是你的代碼錯誤,讓我們通過一個執行它一個:

▶ Time.parse('08:00') - Time.parse('12:00') 
# => -14400.0 

秒,呵呵。精細。

▶ Time.at(Time.parse('08:00') - Time.parse('12:00')) 
=> 1969-12-31 21:00:00 +0100 

哇。所以,Time.at不是我們夢想的方法。此外,我不知道標準庫中的方式是從秒數中獲得格式爲%H:%M的小時。但是:

▶ sprintf "%+03i:%02i", -14400/3600, -14400/60 % 60 # hours, minutes 
# => "-04:00" 

唯一的問題仍然是一個標誌。總結:

▶ time1 = '06:28'; time2 = '12:00' 
▶ diff = Time.parse(time1) - Time.parse(time2) 
▶ sprintf "%+03i:%02i", (diff/diff.abs) * (diff.abs/3600), diff.abs/60 % 60 
# => "-05:32" 

希望它有幫助。

UPD:對於那些,誰喜歡的monkeypatching:

class Time 
    def diff_hours other 
    return nil unless Time === other 
    diff = self - other 
    sprintf "%+03i:%02i", (diff/diff.abs) * (diff.abs/3600), diff.abs/60 % 60 
    end 
end 
# => :diff_hours 
▶ Time.parse('06:32').diff_hours Time.parse('12:00') 
# => "-05:28" 
+0

差不多如此,當結果爲-19920.0時,sprintf ....返回「-5: 1680「而不是」-05:32「(正確) – brunozrk 2014-10-17 11:37:02

+0

哦,對不起,請參閱更新。分鐘不是秒。 – mudasobwa 2014-10-17 11:47:51

+0

現在是「-05:00」 – brunozrk 2014-10-17 11:51:00