找出哪个时间范围包括给定时间

时间:2012-06-26 07:02:16

标签: ruby-on-rails ruby

我有时间范围,例如

正常时间: 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

2 个答案:

答案 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))

虽然很长,但我相信以这种方式编写会使代码更具可读性。即一年之后,如果您能够通过快速查看代码了解最新情况。