Support Request #1424
closedADTFS-48146 Using DateTime::ToTimeStamp leads to unexpected timestamp
Description
Supportanfrage
Hallo,
beim Ausgeben der Zeitstempel aus der ADTF File library ist uns noch etwas aufgefallen:
Verwendung der ADTF File Lib:
::a_util::datetime::DateTime dt{ ::a_util::datetime::get_current_local_date_time( ) };
auto ts = dt.ToTimeStamp( );
Hier erhalte ich sowas: 212378801678930000
Leider ist nicht klar, welche Einheit. Ich vermute aber, da in ADTF Timestamp immer Mikrosekunden hat, dass es das hier auch ist.
Verwendung der C++ Standart Lib:
C++ Standard Lib:
auto now = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::system_clock::now( ).time_since_epoch( ) ).count( );
Im Vergleich dazu ist hier das Ergebnis: 1511994878930 ms
Einheit ist hier klar definiert. Das ist die Zeit seit dem 1.1.1970 (Unix Time, siehe auch https://www.epochconverter.com/ und https://en.wikipedia.org/wiki/Unix_time).
212378801678930000 / 1000 => 212378801678930
Im Vergleich:
212378801678930 ms
1511994878930 ms
Wenn ich die Ausgabe der C++ Standard Lib durch 1000 teile (um Sekunden zu erhalten) und an die DB gebe, sehe ich das korrekte Datum.
Eine Vermuting, dass der ADTF File Lib Timestamp nicht Unix Epoch ist, sondern seit dem 1.1.1900 zählt scheint auch nicht zu passen. Das wären:
3720984789 s
Könnt Ihr uns beschreiben was der Timestamp der ADTF File Lib für ein Wert ist? In der Doku haben wir dazu auch nichts gefunden.
Danke und Grüße,
Anja
Lösung
- Es liegt kein Bug vor (nur wenn man davon ausgeht, dass
DateTime::ToTimeStamp
einen UTC Wert bezogen auf Unixzeit liefert... was aber naheliegend wäre, wenn man sich die UTC Zeit mit Referenz zu Unix-Nullpunkt ins DateTime Objekt holt) - Der Rückgabewert der
DateTime::ToTimeStamp
Methode ist Mikrosekunden - Der Referenzpunkt ist der Nullpunkt des Julianischen Datums.
- Dazu habe ich das Snippet erweitert:
siehe utc_ref_timestamp = 1. Januar 1970, 00:00 Uhr UTC
210866803200000000 us
210866803200000 ms
210866803200 s
58574112 h
240588 d
~6682 y
1970 - 6682 = -4712
- Da die
DateTime::Set
Methode bzw. Konstruktoren vonDateTime
genauso implementiert sind, kann man dasDateTime
Objekt wieder rekonstruieren, die Implementierung, Format und Referenz ist demnach konsistent - Mit Hilfe des Unixzeitpunkt Referenzpunktes (siehe Snippet
utc_ref_timestamp
) kannst du den Wert in Unix/UTC umrechnen und abzüglich Rechenzeit entspricht das Chrono - Wir werden in ODAUTIL-77 die Doku entsprechend erweitern
Files