boost local_date_time Mathe falsch?

8

Ich verwende Boosts Datetime-Bibliothek in meinem Projekt. Ich war sehr glücklich, als ich entdeckte, dass es Zeitdauertypen für Stunden, Tage, Monate, Jahre usw. hat, und sie ändern ihren Wert basierend auf dem, was Sie hinzufügen (dh 1 Monat Vorschüsse den Monatsteil des Datums hinzufügen , es fügt nicht nur 30 Tage oder so etwas hinzu). Ich dachte diese Eigenschaft für den Typ Tage gehalten, aber ich beschloss, es zu testen, bevor ich es in Produktion setzte ...

%Vor%

Oben sehen Sie meinen CPPUNIT-Komponententest. Es schlägt bei der angegebenen Zeile mit 2 fehl, was ich erwarte, wenn days () lediglich 24 Stunden anstelle von 1 logischem Tag hinzufügt (da der DST-Übergang 2010-03-14 in EST 23 Stunden lang ist) / p>

Mache ich etwas falsch? Ist das ein Fehler? Habe ich das Gestaltungsziel der Bibliothek in Bezug auf diese Art von Mathe einfach völlig falsch verstanden?

    
rmeador 11.02.2010, 15:26
quelle

2 Antworten

5

Ich denke, das Problem liegt in der Vorstellung des Fragestellers, was ein Tag ist. Er möchte, dass es hier ein "Datum" Tag ist, anstatt 24 Stunden, aber das ist keine vernünftige Forderung.

Wenn man in der lokalen Zeit arbeitet, muss man auf seltsame Effekte stoßen. Zum Beispiel, was erwarten Sie, wenn in einer Zeitzone, in der die Uhren von 1 Uhr morgens bis 2 Uhr morgens weitergeschaltet werden, die Berechnung der Ortszeit am nächsten Sonntagmorgen um 1.30 Uhr Ortszeit erfolgen sollte? p>

Eine Zeitberechnung hat get um sich 24 Stunden vorwärts zu bewegen - es muss mit der zugrundeliegenden UTC-Zeit arbeiten.

Um die Berechnung "einen Tag springen" wie beschrieben durchzuführen, arbeiten Sie mit dem Datumstyp von Boost und fügen Sie nur die Tageszeit als letzte Aktion hinzu.

Das Geschäft, einen Monat vorziehen zu können, ist ganz anders, denn im Gegensatz zu einem Tag hat ein Kalendermonat keine spezifische Bedeutung als Dauer. Und es verursacht auch Probleme: Wenn Sie einen Kalendermonat vom 31. Januar vorziehen und dann einen Kalendermonat zurückgehen, mit welchem ​​Datum enden Sie?

    
willw 16.02.2010, 12:13
quelle
0

Anstatt die date_duration Objekttage hinzuzufügen, sollten Sie ein boost :: posix_time :: time_duration Objekt erstellen und dieses wie in Ihrer lokalen Zeit hinzufügen: boost :: posix_time :: time_duration td (24, 0, 0, 0); // 24 Stunden, 0 Minuten, Sekunden, Nano boost :: local_time :: local_date_time spater = jetzt + td; // angenommen, dass jetzt dein Startdatum ist // local_date_time, 2010-3-14 // später wird jetzt ein lokales date_time-Objekt sein, das DST vollständig berücksichtigt!

    
programmingDoc 11.02.2010 17:07
quelle

Tags und Links