2012-04-05 66 views
0

我爲時限的模型所規定的時間框架內:檢查事件是否爲

STARTTIME: HH:MM 
ENDTIME: HH:MM 

現在我需要做一個查詢與格式HH給定的時間ACTUALTIME:MM,檢查是否ACTUALTIME在我定義的任何時間範圍內:STARTTIMEENDTIME

因爲當只能由小時和分鐘定義了Ruby對象時總是由一個日期表示,我不知道羯羊有任何的可能性來查詢是這樣的:11:00至15:00 13:40 無考慮日期部分。

回答

0

謝謝Phrogz的意見,我想出如何寫一個可以比較總重量的方法獨立於他們的日期o次。它工作正常,我即使ENDTIME是24: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 
+0

請注意,在Ruby中定義一個類似於另一個方法的方法並不像JavaScript中那樣:每次調用betweenTime時,都會在同一個作用域(非專用)中重新定義一個新的'getseconds'方法。你可能需要'getseconds = lambda {| time | ...}; timestart = getseconds [timestart]'。 – Phrogz 2012-04-07 22:33:36

+0

好的提示...只是補充說。 tnhx諮詢! – JOxBERGER 2012-04-08 09:02:02

+0

請注意,這並不在 'timestart的情況下工作:21:30' 'timeend:04:30' 'timecheck:02:00' 由於事實,你不改變'timecheck'如果'timeend'在24:00之後,那麼在這種情況下,它的數值小於'timestart'且小於'timeend',從而產生'false'返回值... – 2014-01-13 11:52:28

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都要進入紅寶石作爲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 
+0

感謝Phrogz, 兩種解決方案似乎工作完美,只要ENDTIME 24:00等之後是不是:STARTTIME 19:00; ENDTIME 03:00。 但是隨着你的代碼,我想出瞭如何編寫一個方法來完成這項工作。附在這裏 – JOxBERGER 2012-04-07 21:52:05