Frage

Ich fand einen Fehler in einem alten C++ - MFC-Programm haben wir berechnet, dass ein offset (in Tagen) für einen bestimmten Zeitpunkt von einem festen Datum.Wir sehen Ergebnisse, die, aus, indem man für einige Grund, und ich verfolgte Sie nach unten, wo die ursprüngliche Programmierer hatte die CTimeSpan.GetDays () - Methode.Nach der Dokumentation:

Beachten Sie, dass die Zeitumstellung kann die Ursache GetDays zurück eine möglicherweise überraschende Ergebnis.Für Beispiel, wenn die Sommerzeit in Kraft ist, GetDays gibt die Anzahl von Tagen zwischen 1. April und 1. Mai 29, 30, weil an einem Tag im April verkürzt sich um eine Stunde und ist daher nicht zählen, wie ein ganzer Tag.

Meine vorgeschlagene Lösung ist, verwenden Sie (obj.GetTotalHours()+1)/24 statt.Ich denke, das wäre für alle die Probleme, denn dies ist ein batch-job, der läuft in etwa zur gleichen Zeit jeden Tag, aber ich dachte, ich würde bitten, die schlaue Leute hier, bevor Sie Sie implementieren, wenn es könnte einen besseren Weg geben.

Dies ist nur eine Randerscheinung, aber ich bin auch neugierig, wie diese behandelt werden würde, wenn das Programm konnte jederzeit ausgeführt werden.

War es hilfreich?

Lösung

Ihr fix funktioniert gut, um die Anzahl der gesamten 24-Stunden-Zeiträume zwischen zwei Zeit - wie lange, wie die Ereignisse auftreten, in der gleichen Zeit jeden Tag.Andernfalls wird die "+1" in der expression könnte zu einem off-by-one-Fehler.

Manchmal ist man gar nicht egal, was Zeit des Tages der Fall aufgetreten ist, möchten Sie einfach nur wissen, welcher Tag.In diesem Fall müssen Sie die null, die Stunden, Minuten und Sekunden an, dann verwenden Sie die Formel:

CTime startDay(start.GetYear(), start.GetMonth(), start.GetDay(), 0, 0, 0);
CTime finishDay(finish.GetYear(), finish.GetMonth(), finish.GetDay(), 0, 0, 0);
int days = ((finishDay - startDay).GetTotalHours() + 1) / 24;

Andere Tipps

Eine geringfügige Änderung, was Mark vorgeschlagen und es funktioniert ohne Vertrauen auf Rundung: Nur noch einen Parameter von Null auf den CTime Konstruktor hinzuzufügen. Dies zwingt beide Male in Standardzeit (nicht die Sommerzeit). Der Standardwert für diesen Parameter ist -1, was bedeutet, „automatisch berechnen, wenn die Sommerzeit in Kraft ist.“

// Discard hours, minutes, seconds, and daylight savings time
CTime startDay(start.GetYear(), start.GetMonth(), start.GetDay(), 0, 0, 0, 0);
CTime endDay(end.GetYear(), end.GetMonth(), end.GetDay(), 0, 0, 0, 0);

// Get number of days apart
CTimeSpan span = endDay - startDay;
int nDays = span.GetDays();

geprüft und Arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top