计算时间范围内的时间

时间:2016-02-02 17:34:59

标签: ruby-on-rails ruby

我需要计算指定范围内的时间量。例如,我有范围(让我们称之为高峰时段)12:00-14:00。我有另一个范围(访问时间),可能会改变,前9:00-15:00。如何获得这两个范围的交叉时间?

结果我希望得到类似的结果:{peak_hours: 2, regular_hours: 4} 此处peak_hours值为2,因为许多高峰时段与常规时段重叠。并且,regular_hours值为4,因为许多常规时段与高峰时段不重叠。

我有点坚持使用解决方案。我试图使用时间范围,但这对我没有用。这是代码

peak_hours_range = Time.parse(peak_hour_start)..Time.parse(peak_hour_end)

session_range = visit_start..visit_end

inters = session_range.to_a & peak_hours_range.to_a

但这会引发我类型错误

2 个答案:

答案 0 :(得分:1)

您可以随时尝试找到路口。

inters = nil

intersection_min = [peak_hour_start, visit_start].max
intersection_max = [peak_hour_end, visit_end].min

if intersection_min < intersection_max
  inters = [intersection_min, intersection_max]
end

inters

当然,可以通过将其提取到自己的方法中来清理它。

答案 1 :(得分:1)

这是一种方法,我们发现包含两个范围的总小时数,然后从中删除高峰时间以获得有效的正常工作时间。

require "time"

peak_hour_start = "12:00"
peak_hour_end = "14:00"

regular_hour_start = "9:00"
regular_hour_end = "15:00"

ph = (Time.parse(peak_hour_start).hour...Time.parse(peak_hour_end).hour).to_a
#=> [12, 13]
rh = (Time.parse(regular_hour_start).hour...Time.parse(regular_hour_end).hour).to_a
#=> [9, 10, 11, 12, 13, 14]
total = (ph + rh).uniq
#=> [12, 13, 9, 10, 11, 14]
r = {peak_hours: (ph - rh).size, regular_hours: (total - ph).size}
#=> {:peak_hours=>2, :regular_hours=>4}