std::chrono time_point in Ortszeit statt UTC?
-
Hallo zusammen,
gibt´s eine einfache Methode, den UTF-Zeitstempel, den mir
std::chrono::system_clock::now()
liefert, in einentime_point
in Ortszeit umzuwandeln? Eine Konstruktion ausstd::time_t
möchte ich nicht, da das nur sekundengenau st.
Bisher mache ich das (viel zu kompliziert imho) so:#include <ctime> #include <chrono> std::chrono::time_point f() { std::time_t time_now = time( nullptr ); // lokale Zeit bestimmen std::tm tm_local; std::time_t time_local = std::mktime( std::localtime_s( &time_now, &tm_local ) ); // UTC bestimmen std::tm tm_utc; std::time_t time_utc = std::mktime( std::gmtime_s( &time_now, &tm_utc ) ); // Differenz bestimmen und auf log_clock::now() addieren return std::chrono::system_clock::now() + std::chrono::seconds( time_utc - time_local ); }
-
Speichere eine Zeitzone zum Timestamp mit "make_zoned". Den time_point selbst würde ich nicht ändern.
Siehe: https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes#the-current-local-time
-
Danke für den Hinweis, wob.
Bei meiner STL Implementation ist die date-Bibliothek nicht dabei. Und nur für eine Funktion möchte ich die jetzt auch nicht installieren. Wenn´s mit Bordmitteln nicht einfacher geht dann beiß´ ich halt in den sauren Apfel.
-
Was heißt installieren?
Du musst nur den header und cpp file (nur notwendig für timezone) in dein projekt kopieren
-
Konkret geht´s darum, das spdlog seine Meldungen bei uns mit falschen Zeitstempeln ausgibt. Intern wird der Zeitstempel per
std::chrono::system_clock::now()
erzeugt und bei der Ausgabe vompattern_formatter
angeblich nach localtime konvertiert und formatiert. Man kann den Formatter anweisen, entweder local oder utc zu benutzen. Die utc-Ausgabe für 17:30 MEZ ist richtig 16:30, die local-Ausgabe mit 18:30 liegt um 1h falsch.
Ich hab mich dann mal etwas mitstd::chrono::system_clock
beschäftigt und verstehe den Zeitstempel, denstd::chrono::system_clock::now()
zurückgibt, nicht:#include <ctime> #include <chrono> using namespace std; using namespace std::chrono; int main() { char time_zone[] = "TZ=CET-1CEST"; putenv( time_zone ); tzset(); struct tm tm_gm; // 59, 29, 16, 12, 2, 119, 2, 70, 1 => 16:29:59 12.03.2019 (ok) struct tm tm_lc; // 59, 29, 17, 12, 2, 119, 2, 70, 1 => 17:29:59 12.03.2019 (ok) time_t time_now = time( nullptr ); // 1552404599 time_t time_lc = mktime( localtime_s( &time_now, &tm_lc ) ); // 1552404599 time_t time_gm = mktime( gmtime_s( &time_now, &tm_gm ) ); // 1552400999 time_t chrono_utc = system_clock::to_time_t( system_clock::now() ); // 1552408199 int diff_lc_chrono = time_lc - chrono_utc; // -3600 ??? int diff_lc_gm = time_lc - time_gm; // 3600 int diff_chrono_lc = chrono_utc - time_lc; // 3600 ??? int diff_chrono_gm = chrono_utc - time_gm; // 7200 ??? }
Hier das Ergebnis auf Ideone
Sieht so aus als wäre die RAD Studio Implementation kaputt
-
Dieser Beitrag wurde gelöscht!