Project

General

Profile

Actions

Support Request #1424

closed

ADTFS-48146 Using DateTime::ToTimeStamp leads to unexpected timestamp

Added by hidden over 6 years ago. Updated over 6 years ago.

Status:
Closed
Priority:
Normal
Customer:
ELEKTROBIT
Department:
SUPPORT
Requester's Priority:
Normal
Support Level:
3rd Level
Resolution:
Known Problem
Platform:
Ubuntu 16.04 64bit, Windows 7 64bit
Topic:
FileLibrary::Common
FAQ Links:

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 von DateTime genauso implementiert sind, kann man das DateTime 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

convert_chrono.png (19.9 KB) convert_chrono.png hidden, 2017-12-01 17:32
time_test_snippet.JPG (69.8 KB) time_test_snippet.JPG hidden, 2017-12-01 17:32
code_snippet_datetime.JPG (105 KB) code_snippet_datetime.JPG hidden, 2017-12-05 12:10
Actions

Also available in: Atom PDF