0

例如,我有时间范围

正常时间:03:15 - 17:00

折扣时间: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

折扣时间: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
4

2 回答 2

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

虽然很长,但我相信以这种方式编写代码会使代码更具可读性。即一年后,如果您能够通过快速查看代码来理解发生了什么。

于 2012-06-26T07:24:33.627 回答
1

范围总是从小数到大数。当你有一个范围时:19:00-01:10你正在创建一个无效的范围。要修复它,只需划分范围,以便您拥有19:00-23:59一个新范围,然后00:00-01:10覆盖其余时间跨度。

于 2012-06-26T07:19:57.040 回答