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

範囲は常に低い数値から高い数値までです。次のような範囲がある場合:19:00-01:10無効な範囲を作成しています。それを修正するには、範囲を分割して、残りのタイムスパンをカバー19:00-23:59する新しい範囲を作成します。00:00-01:10

于 2012-06-26T07:19:57.040 に答える
1

今日の午前0時を基点にしてみてください

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

長くなりますが、このように書くとコードが読みやすくなると思います。つまり、コードをすばやく見て何が起こっているのかを理解できる場合は、1 年後です。

于 2012-06-26T07:24:33.627 に答える