ruby Rails -获取以小时、分钟和秒为单位的时差

fwzugrvs  于 2023-08-04  发布在  Ruby
关注(0)|答案(5)|浏览(166)

我正在寻找一个习惯的方法来获得时间通过,因为一个给定的日期在小时,分钟和秒。
如果给定日期为2013-10-25 23:55:00,当前日期为2013-10-27 20:55:09,则返回值应为45:03:09。time_differencetime_diff gem不能满足此要求。

yqkkidmi

yqkkidmi1#

你可以试试这个:

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"

vybvopom

vybvopom2#

time_diff = Time.now - 2.minutes.ago
Time.at(time_diff.to_i.abs).utc.strftime "%H:%M:%S"
=> "00:01:59"

字符串
或者,如果你的应用对舍入很挑剔,只需将to_i替换为round:

Time.at(time_diff.round.abs).utc.strftime "%H:%M:%S"
   => => "00:02:00"


但不确定习惯用语部分
更新:如果预计时差超过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"

inkz8wg9

inkz8wg93#

有一种方法可以做到这一点:
第一个月
等于10(实际上,9.99...,如果你想要一个10,使用.round)。
来源:http://apidock.com/rails/Time/minus_with_coercion
希望我帮上忙了。

4c8rllxm

4c8rllxm4#

因为这还没有被标记为重复,the response in the main thread只是更清晰的IMHO。我将在这里添加它以获得更多可见性:
使用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]

字符串
您可能可以通过使用collectinject来进一步干燥它,但是当核心逻辑只有三行时,它可能会矫枉过正。
请注意,我已经改变了一点答案,以更好地适应这个线程的问题。

txu3uszq

txu3uszq5#

一旦你得到了以秒为单位的时差,你就可以做这样的事情

Time.at(t).utc.strftime("%H:%M:%S")

字符串
其中t是以秒为单位的时间差

相关问题