2009-08-01 5 views
2

ich eine Anforderung haben, geht als (mir vertrauen, ich bin viel zu alt für die Hausaufgaben Grinsen) folgtBerechnung Aufgabe Startzeiten

ich eine Reihe von Aufgaben, die mit verschiedenen Frequenzen laufen. Sie haben auch einen Start "Seed" Datum/Uhrzeit. Der Anfangssamen ist irgendwann in der Vergangenheit, könnte vor einer Minute sein, könnte vor 5 Jahren sein.

Ich muss die nächste Laufzeit für die Aufgabe berechnen, mit Start Startdatum/-zeit und die Häufigkeit - es kann nicht einfach "jetzt" + die Aufgabenfrequenz (für diejenigen von Ihnen, die Aufträge auf MS SQL geplant haben Server dies ist ein vertrautes Konzept)

Jetzt ist die alberne Art und Weise, es zu tun, den Start Startwert und fügen Sie die Häufigkeit, bis es größer als "jetzt" wird. Das ist kaum optimal. Der naive Weg wäre, das Anfangsdatum zu nehmen, es auf das heutige Datum zu ändern und die Zeit so zu belassen, wie es ist, dann die Frequenz zu addieren, bis sie größer ist als jetzt, aber die Frequenz ist ein Vielfaches von 24 Stunden.

Was ist der beste/schnellste Weg, dies zu tun? Bonuspunkte für eine C# -Lösung, aber dies ist generisch genug, um ein interessantes Puzzle für jede Sprache zu erstellen :)

Antwort

6

Eine bessere Methode wäre es, den Unterschied zwischen dem Start-Timestamp und dem aktuellen Timestamp zu nehmen, dividiere das durch die Frequenz, Runden Sie den resultierenden Multiplikator auf die nächste ganze Zahl auf, multiplizieren Sie ihn erneut mit der Häufigkeit, und fügen Sie ihn erneut zum Start-Zeitstempel hinzu.

Das Aufrunden sorgt für den richtigen Offset.

+0

Dies ist nichts weniger als schwarze Magie. Tolle. –

0

Ihre Antwort würde dies im Wesentlichen sein:

next_time = ceiling((now - seed)/frequency) * frequency + seed 

Mit der Ceiling-Funktion sorgt dafür, dass NEXT_TIME jetzt> = sein wird.

Sie würden die notwendigen Konvertierungen zu tun haben, um diese Arithmetik auf die Tage auszuführen (zB UNIX Zeit zu übersetzen, die 1 Anzahl der Sekunden seit Jan ist, 1970)

Ich bin nicht vertraut mit C#, so kann ich den Code nicht anbieten, aber ich nehme an, dass C# Datum/Uhrzeit-Dienstprogramm Klassen für den Umgang mit Datum/Uhrzeit arithmetischen Operationen hat.

+0

Du hast ein extra Recht paren nach Häufigkeit. –

+0

Danke, repariert es. – alanlcode

0

Interessante Rätsel, danke für die Herausforderung :)

Dies sollte es in C# tun. Kann fast sicher abgespeckt werden, aber es ist ausführlich genug, um zu erklären, was los ist.

// Initialise with date the event started, and frequency 
DateTime startDate = new DateTime(2009, 8,1,9,0,0); 
TimeSpan frequency = new TimeSpan(0, 15, 0); 

// Store datetime now (so that it doesnt alter during following calculations) 
DateTime now = DateTime.Now; 

// Calculate the number of ticks that have occured since the event started 
TimeSpan pastTimeSpan = now.Subtract(startDate); 

// Divide the period that the event has been running by the frequency 
// Take the remaining time span 
TimeSpan remainingTimeSpan = new TimeSpan(pastTimeSpan.Ticks % frequency.Ticks); 

// Calculate last occurence the event ran 
DateTime lastOccurence = now.Subtract(remainingTimeSpan); 

// Calculate next occurence the event will run 
DateTime nextOccurence = lastOccurence.Add(frequency);