0

次のように定義された時間枠のモデルがあります。

STARTTIME: HH:MM
ENDTIME: HH:MM

ACTUALTIMEここで、HH:MM 形式の特定の時間でクエリを実行し、とACTUALTIMEで定義された特定の時間枠のいずれかに含まれているかどうかを確認する必要がSTARTTIMEありENDTIMEます。

時間と分のみで定義された Ruby の時間オブジェクトは常に日付で表されるため、次のようなクエリを実行する可能性があるかどうか疑問に思います。アカウント。

4

2 に答える 2

1

あなたHH:MMが文字列であり、それらが常にゼロで埋められている場合 (例: "03:08")、単純な文字列比較を使用できます:

irb:02> first = "03:17"; last = "11:54"
#=> "11:54"
irb:03> range = first..last
#=> "03:17".."11:54"
irb:04> range.include? "00:00"
#=> false
irb:05> range.include? "03:50"
#=> true
irb:06> range.include? "03:09"
#=> false
irb:07> range.include? "12:17"
#=> false
irb:08> range.include? "11:17"
#=> true

STARTTIME と ENDTIME が のインスタンスとして Ruby に取り込まれる場合はTime、それらを文字列に変換するメソッド ( my_time.strftime('%H:%M')) を作成するか、単純にコンパレータを作成することができます。

# Returns true if hour:min is between the times in t1 and t2
def between(hour,min,t1,t2)
  t1.hour<=hour && hour<=t2.hour && t1.min<=min && min<=t2.min
end
于 2012-04-05T16:31:52.013 に答える
0

Phrogz のアドバイスに感謝します。日付に関係なく 2 回比較できるメソッドを作成する方法を見つけました。ENDTIME24:00以降でも問題なく動作します

def betweenTime(timestart, timeend, timecheck)

 getseconds = lambda{ |time| time.hour*60*60 + time.min*60 + time.sec}

 timestart = getseconds[timestart]
 timeend = getseconds[timeend]
 timecheck = getseconds[timecheck]


 if (timeend-timestart) < 0
   timeend = timeend + (60*60*24) # add seconds for one day if timeend is after 24:00
 end

 timecheck.between?(timestart, timeend)
end
于 2012-04-07T21:59:06.930 に答える