I'm looking for an idiomatic way to get the time passed since a given date in hours, minutes and seconds.
我在寻找一种惯用的方式,以小时、分钟和秒为单位来计算约会结束后的时间。
If the given date is 2013-10-25 23:55:00 and the current date is 2013-10-27 20:55:09, the returning value should be 45:03:09. The time_difference and time_diff gems won't work with this requirement.
如果给定的日期是2013-10-25 23:55:00,当前日期是2013-10-27 20:55:09,返回值应为45:03:09。time_difference和time_diff gem不能使用这个需求。
4 个解决方案
#1
32
You can try with this:
你可以试试这个:
def time_diff(start_time, end_time)
seconds_diff = (start_time - end_time).to_i.abs
hours = seconds_diff / 3600
seconds_diff -= hours * 3600
minutes = seconds_diff / 60
seconds_diff -= minutes * 60
seconds = seconds_diff
"#{hours.to_s.rjust(2, '0')}:#{minutes.to_s.rjust(2, '0')}:#{seconds.to_s.rjust(2, '0')}"
# or, as hagello suggested in the comments:
# '%02d:%02d:%02d' % [hours, minutes, seconds]
end
And use it:
并使用它:
time_diff(Time.now, Time.now-2.days-3.hours-4.minutes-5.seconds)
# => "51:04:04"
#2
24
time_diff = Time.now - 2.minutes.ago
Time.at(time_diff.to_i.abs).utc.strftime "%H:%M:%S"
=> "00:01:59"
Or if your app is picky about rounding, just replace to_i to round:
或者,如果你的应用程序对四舍五入很挑剔,只需将to_i替换为round:
Time.at(time_diff.round.abs).utc.strftime "%H:%M:%S"
=> => "00:02:00"
Not sure about the idiomatic part though
但不确定习惯部分
Update: If time difference is expected to be more than 24 hours then the above code is not correct. If such is the case, one could follow the answer of @MrYoshiji or adjust above solution to calculate hours from a datetime object manually:
更新:如果预期时差超过24小时,则上述代码不正确。如果是这样,你可以按照@MrYoshiji的答案,或者调整上面的解决方案,从datetime对象手工计算小时数:
def test_time time_diff
time_diff = time_diff.round.abs
hours = time_diff / 3600
dt = DateTime.strptime(time_diff.to_s, '%s').utc
"#{hours}:#{dt.strftime "%M:%S"}"
end
test_time Time.now - 28.hours.ago - 2.minutes - 12.seconds
=> "27:57:48"
test_time Time.now - 8.hours.ago - 2.minutes - 12.seconds
=> "7:57:48"
test_time Time.now - 24.hours.ago - 2.minutes - 12.seconds
=> "23:57:48"
test_time Time.now - 25.hours.ago - 2.minutes - 12.seconds
=> "24:57:48"
#3
6
There's a method for that:
对此有一个方法:
Time.now.minus_with_coercion(10.seconds.ago)
Time.now.minus_with_coercion(10. seconds.ago)
equals 10 (in fact, 9.99..., use .round
if you want a 10).
等于10(事实上,9.99……)如果你想要一个10)的圆。
Source: http://apidock.com/rails/Time/minus_with_coercion
来源:http://apidock.com/rails/Time/minus_with_coercion
Hope I helped.
希望我帮助。
#4
3
Look at
看看
how to convert 270921sec into days + hours + minutes + sec ? (ruby)
如何将270921秒转换成天+小时+分钟+秒?(ruby)
which is very similar to your question, just starting from the difference in seconds
这和你的问题很相似,只是从秒数的差开始
#1
32
You can try with this:
你可以试试这个:
def time_diff(start_time, end_time)
seconds_diff = (start_time - end_time).to_i.abs
hours = seconds_diff / 3600
seconds_diff -= hours * 3600
minutes = seconds_diff / 60
seconds_diff -= minutes * 60
seconds = seconds_diff
"#{hours.to_s.rjust(2, '0')}:#{minutes.to_s.rjust(2, '0')}:#{seconds.to_s.rjust(2, '0')}"
# or, as hagello suggested in the comments:
# '%02d:%02d:%02d' % [hours, minutes, seconds]
end
And use it:
并使用它:
time_diff(Time.now, Time.now-2.days-3.hours-4.minutes-5.seconds)
# => "51:04:04"
#2
24
time_diff = Time.now - 2.minutes.ago
Time.at(time_diff.to_i.abs).utc.strftime "%H:%M:%S"
=> "00:01:59"
Or if your app is picky about rounding, just replace to_i to round:
或者,如果你的应用程序对四舍五入很挑剔,只需将to_i替换为round:
Time.at(time_diff.round.abs).utc.strftime "%H:%M:%S"
=> => "00:02:00"
Not sure about the idiomatic part though
但不确定习惯部分
Update: If time difference is expected to be more than 24 hours then the above code is not correct. If such is the case, one could follow the answer of @MrYoshiji or adjust above solution to calculate hours from a datetime object manually:
更新:如果预期时差超过24小时,则上述代码不正确。如果是这样,你可以按照@MrYoshiji的答案,或者调整上面的解决方案,从datetime对象手工计算小时数:
def test_time time_diff
time_diff = time_diff.round.abs
hours = time_diff / 3600
dt = DateTime.strptime(time_diff.to_s, '%s').utc
"#{hours}:#{dt.strftime "%M:%S"}"
end
test_time Time.now - 28.hours.ago - 2.minutes - 12.seconds
=> "27:57:48"
test_time Time.now - 8.hours.ago - 2.minutes - 12.seconds
=> "7:57:48"
test_time Time.now - 24.hours.ago - 2.minutes - 12.seconds
=> "23:57:48"
test_time Time.now - 25.hours.ago - 2.minutes - 12.seconds
=> "24:57:48"
#3
6
There's a method for that:
对此有一个方法:
Time.now.minus_with_coercion(10.seconds.ago)
Time.now.minus_with_coercion(10. seconds.ago)
equals 10 (in fact, 9.99..., use .round
if you want a 10).
等于10(事实上,9.99……)如果你想要一个10)的圆。
Source: http://apidock.com/rails/Time/minus_with_coercion
来源:http://apidock.com/rails/Time/minus_with_coercion
Hope I helped.
希望我帮助。
#4
3
Look at
看看
how to convert 270921sec into days + hours + minutes + sec ? (ruby)
如何将270921秒转换成天+小时+分钟+秒?(ruby)
which is very similar to your question, just starting from the difference in seconds
这和你的问题很相似,只是从秒数的差开始