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 einen time_point in Ortszeit umzuwandeln? Eine Konstruktion aus std::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 vom pattern_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 mit std::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 😕



  • This post is deleted!

Log in to reply