我正在尝试计算Rails 5中记录的“剩余时间”。我的记录有一个created_at
列(UTC)。
每条记录持续24小时,我的模型具有全局范围:
scope :available, -> { where(
created_at: (Time.current - 24.hours)..Time.current
) }
现在,在前端,我需要的是:
Record id 1: 23:59:12
Record id 2: 22:23:03
...
经过一些研究,我发现有一些帮手正在做这项工作,但它看起来很难看,这就是我要求你帮助的原因。
这是我的(笨拙但有效)代码:
# In my helper:
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')}"
end
# And my the view:
time_diff(Time.current - 24.hours, model_instance.created_at)
我确定我错过了一些非常棒的Rails助手,它可以使所有这些单行:)
感谢您阅读。
答案 0 :(得分:0)
好吧,你可以使用时差宝石
http://www.rubydoc.info/github/tmlee/time_difference
start_time = Time.new(2013,1)
end_time = Time.new(2014,1)
TimeDifference.between(start_time, end_time).in_each_component
=> {:years=>1.0, :months=>12.0, :weeks=>52.14, :days=>365.0, :hours=>8760.0, :minutes=>525600.0, :seconds=>31536000.0}
答案 1 :(得分:0)
您可以尝试使用Ruby Core Library中的Time类。使用Time.at(seconds)
创建一个具有自Epoch以来给定秒数的新Time对象。由于您的时间窗口不到24小时,您可以直接致电strftime
而无需进行任何进一步的计算。
def time_diff(start_time, end_time)
seconds_diff = (start_time - end_time).abs
Time.at(seconds_diff).utc.strftime "%H:%M:%S"
end
您应该避免致电to_i
,因为这会降低剩余时间的准确性