我需要计算指定范围内的时间量。例如,我有范围(让我们称之为高峰时段)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
但这会引发我类型错误
答案 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}