我有时间范围,例如
正常时间: 03:15 - 17:00
discounttime: 17:00 - 23:10
夜间: 23:10 - 03:15
我必须找到当前时间属于哪个范围。
在我有这样的代码之前:
when (3*60+15)..(17*60+00)
puts "normal_time"
when (17*60+00)..(23*60+10)
puts "disc_time"
else
puts "night_time"
end
但是如果我有
正常时间: 07:15 - 19:00
discounttime: 19:00 - 01:10
夜间: 01:10 - 07:15
我应该使用哪个代码才能使两个配置都有效?
我应该使用2天吗?
肮脏的解决方案
我知道代码没有经过优化,但它确实有效。我会重构它
time = Time.now
a = [:normal_time, :disc_time, :night_time]
b = a + [a[0]]
pp = Priceplan.last # has times sets for :normal_time, :disc_time, :night_time
check = time.hour*60+time.min
a.each_with_index do |e, i|
starts_at = pp.send(e).hour * 60 + pp.send(e).min
ends_at = pp.send(b[i+1]).hour * 60 + pp.send(b[i+1]).min
if starts_at < ends_at
if (starts_at..ends_at).include?(check)
p "ok!!!!!!!! at #{e}"
break
end
else
if (starts_at..(24*60)).include?(check)
p "ok!!!!!!!! at #{e} (divided first)"
break
elsif (0..ends_at).include?(check)
p "ok!!!!!!!! at #{e} (divided second)"
break
end
end
end
答案 0 :(得分:1)
范围总是从低数字到高数字。如果您的范围如下:19:00-01:10
,则表示您创建了无效范围。要解决这个问题,只需将范围分开,即可获得19:00-23:59
,然后使用新范围00:00-01:10
来覆盖剩余的时间范围。
答案 1 :(得分:1)
您可以尝试使用今天午夜作为基点
def today_midnight
Time.now.utc.midnight
end
normal time : where(:belongs_to => (today_midnight + 7.hours + 15.minutes) .. (today_midnight + 19.hours))
discount time : where(:belongs_to => (today_midnight + 1.hours + 10.minutes) .. (today_midnight + 19.hours))
night time: where(:belongs_to => (today_midnight + 1.hour + 10.minutes) .. (today_midnight + 7.hours + 15.minutes))
虽然很长,但我相信以这种方式编写会使代码更具可读性。即一年之后,如果您能够通过快速查看代码了解最新情况。