我正在寻找一种惯用的方法来获取自给定日期以来以小时、分钟和秒为单位的时间。
如果给定日期为 2013-10-25 23:55:00,当前日期为 2013-10-27 20:55:09,则返回值应为 45:03:09。time_difference和time_diff gem 不适用于此要求。
我正在寻找一种惯用的方法来获取自给定日期以来以小时、分钟和秒为单位的时间。
如果给定日期为 2013-10-25 23:55:00,当前日期为 2013-10-27 20:55:09,则返回值应为 45:03:09。time_difference和time_diff gem 不适用于此要求。
你可以试试这个:
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
并使用它:
time_diff(Time.now, Time.now-2.days-3.hours-4.minutes-5.seconds)
# => "51:04:04"
time_diff = Time.now - 2.minutes.ago
Time.at(time_diff.to_i.abs).utc.strftime "%H:%M:%S"
=> "00:01:59"
或者,如果您的应用程序对舍入很挑剔,只需将 to_i 替换为舍入:
Time.at(time_diff.round.abs).utc.strftime "%H:%M:%S"
=> => "00:02:00"
虽然不确定惯用的部分
更新:如果预计时差超过 24 小时,则上述代码不正确。如果是这种情况,可以遵循@MrYoshiji 的答案或调整上述解决方案以手动从日期时间对象计算小时数:
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"
有一个方法:
Time.now.minus_with_coercion(10.seconds.ago)
等于 10(实际上是 9.99...,.round
如果您想要 10,请使用)。
资料来源:http ://apidock.com/rails/Time/minus_with_coercion
希望我有所帮助。
由于这没有被标记为重复,并且主线程中的响应更加清晰恕我直言。我将在此处添加它以获得更多可见性:
它可以非常简洁地使用
divmod
:t = (end_time - start_time).round.abs mm, ss = t.divmod(60) hh, mm = mm.divmod(60) puts "%02d:%02d:%02d" % [hh, mm, ss]
collect
您可能可以通过使用, 或者也许进行创意来进一步干燥它inject
,但是当核心逻辑是三行时,它可能是矫枉过正的。
请注意,我已经更改了一些答案以更好地适应这个线程的问题。
一旦你得到以秒为单位的时差,你可以做这样的事情
Time.at(t).utc.strftime("%H:%M:%S")
t
时差在哪里,以秒为单位