2016-05-24 6 views
1

Ich habe eine Frage zur Verarbeitungszeit in Inkrementen in meiner Rails App.Ruby on Rails erhält Intervallwerte zwischen start_at und end_at

Ich habe einen Zeitplan Modell mit diesen Spalten:

:user_id => 1, 
:day => “Sunday”, 
:start_at => “08:00AM”, 
:end_at => “03:30PM”, 
:average_time => “30” # this average time in minutes 

ich Schleife muß von den start_at die end_at in Schritten von 30 Minuten, etwa so:

08:00 AM 

08:30 AM 

09:00 AM 

09:30 AM 

10:00 AM 

… 

… 

03:30 PM 

Wie kann ich verarbeiten der Unterschied zwischen den Zeiten inkrementell so?

+0

woher wissen Sie, an welchem ​​Tag es ist? Ist die Reichweite auf einen Tag garantiert? Müssen Sie nur auf dem Bildschirm drucken? – Anthony

+0

Ich habe Aufzeichnungen für jeden Tag, und dieses Beispiel für Sonntag – zippax

+0

Beginnen und enden die Zeiten immer mit einer ganzen oder halben Stunde? – Stefan

Antwort

1

Sie können das step für eine Bereichsschleife verwenden, um das zu tun. Hier ist ein Beispiel für Ihr Modell:

total_minutes = (schedule.end_at - schedule.start_at)/60 

(0..total_minutes).step(30) do |minutes| 
    time = schedule.start_at + minutes*60 
    puts "#{time.strftime('%H:%M')}" 
end 

Das beginnt von total_minutes aus der Differenz zwischen dem start_at und end_at mal Berechnung Umwandlung von Sekunden bis Minuten. Dies setzt voraus, dass es sich um Ruby-Time-Objekte und nicht um Strings handelt. Die Zeichenfolgen müssen vor der Verwendung dieses Codes in Zeit konvertiert werden.

Als nächstes schreitet die Schleife von start_at in Schritten von 30 Minuten fort, indem die Minuten für jede Schleifeniteration (* 60) zu start_at hinzugefügt werden. Bei jedem Intervall gibt die Schleife die Zeit aus, bis sie end_at erreicht oder überschreitet.

+1

Danke mann, es funktioniert – zippax

+0

@zippax Froh, das zu hören! Viel Glück! –

1

Konvertieren Sie alles in Sekunden, analysieren Sie die Zeiten und multiplizieren Sie Ihren "Durchschnitt" mit 60. Dann machen Sie einfach Ihre Schleife von Start_time bis End_time im Durchschnitt erhöhen. Zurück in die Zeit umwandeln und drucken oder machen, was immer Sie wollen.

Im Allgemeinen müssen Sie alles in equals umwandeln, um daran arbeiten zu können. Wenn das Sekunden oder Minuten sind, sollte alles funktionieren. Sekunden erleichtern das Arbeiten mit Zeitobjekten.

+0

Danke mann für deine hilfe – zippax