2014-10-17 225 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