2012-04-05 12 views
0

Ich habe ein Modell für die Zeiträume definiert durch:prüfen, ob ein Ereignis innerhalb eines Zeitraums

STARTTIME: HH:MM 
ENDTIME: HH:MM 

Jetzt muß ich mit einem bestimmten Zeitpunkt ACTUALTIME im Format HH eine Abfrage tun: MM, und prüfen, ob ACTUALTIME ist innerhalb eines meiner angegebenen Zeitrahmen definiert durch: STARTTIME und ENDTIME.

Da das Ruby-Zeitobjekt, wenn nur durch die Stunde und Minute definiert, immer durch ein Datum repräsentiert wird, frage ich mich, ob es irgendeine Möglichkeit gibt, etwas abzufragen: Ist 13:40 zwischen 11:00 und 15:00 ohne Berücksichtigung des Datumsteils.

Antwort

0

Vielen Phrogz Rat, den ich herausgefunden, wie ein Verfahren zu schreiben, die tw vergleichen o mal unabhängig von ihrem Datum. Es funktioniert für mich auch in Ordnung, wenn die ENDTIME nach 24:00 Uhr ist

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

Beachten Sie, dass das Definieren einer Methode in einer anderen wie der in Ruby nicht wie in JavaScript ist: Sie definieren bei jedem Aufruf von 'betweenTime' eine neue' getseconds' Methode im selben Bereich (nicht privat). Sie können stattdessen 'getseconds = lambda {| time | ...}; timestart = getseconds [Zeitstempel] '. – Phrogz

+0

guter Hinweis ... nur hinzugefügt. tnhx für Beratung! – JOxBERGER

+0

Beachten Sie, dass dies nicht im Falle von 'time funktioniert: 21: 30' ' TimeEnd: 04: 30' 'Timecheck: 02: 00 ' Aufgrund der Tatsache, dass Sie verändern nicht' timecheck' wenn "timeend" nach 24:00 ist, und in diesem Fall ist der numerische Wert kleiner als "timestart" UND kleiner als "timeend", was zu einem "false" Rückgabewert führt ... –

1

Wenn Ihr HH:MM sind Strings, und sie sind immer mit Nullen aufgefüllt (zB „3.08“), dann können Sie nur einen einfachen String-Vergleich verwenden:

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 

Wenn Ihr STARTTIME und ENDTIME kommen in Rubin als Instanzen Time dann können Sie entweder eine Methode schreibt sie in Zeichenfolgen zu konvertieren (my_time.strftime('%H:%M')) oder Sie können einfach einen Komparator schreiben:

# 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

Dank Phrogz, beiden Lösungen scheinen so lange perfekt zu arbeiten, wie ENDTIME nicht nach 24:00 Uhr wie ist: STARTTIME 19:00; ENDE 03:00. Aber mit der hep von Ihrem Code habe ich herausgefunden, wie man eine Methode schreibt, die den Job macht. hier angehängt – JOxBERGER

Verwandte Themen