Zeit seit Mitternacht



  • Ich suche einen Weg die Zeit(in Minuten oder Stunden) die seit Mitternacht vergangen sind auszulesen und in eine Variable zu schreiben.
    Ich schaffe es nur die vergangene Zeit seit 1. Januar 1970, 00:00:00 bis jetzt zu bekommen.

    Habt ihr irgendwelche vorschläge?



  • Stumpfel schrieb:

    Ich suche einen Weg die Zeit(in Minuten oder Stunden) die seit Mitternacht vergangen sind auszulesen und in eine Variable zu schreiben.
    Ich schaffe es nur die vergangene Zeit seit 1. Januar 1970, 00:00:00 bis jetzt zu bekommen.

    Dann zieh doch die 43 und ein paar zerquetschten Jahre bis gestern Nacht 0.00h wieder ab.



  • Mit Sekunden schaffe ich es.

    sekundenSeitMitternacht = sekundenSeit01011971Um00h % (60*60*24);
    


  • Vorschlag mit localtime:

    #include <iostream>
    #include <ctime>
    
    int main()
    {
        using namespace std;
        time_t now = time( nullptr );
        tm* uhrzeit = localtime( &now );
        cout << uhrzeit->tm_hour << ":" << uhrzeit->tm_min << ":" << uhrzeit->tm_sec << endl;
        return 0;
    }
    


  • volkard schrieb:

    Mit Sekunden schaffe ich es.

    sekundenSeitMitternacht = sekundenSeit01011971Um00h % (60*60*24);
    

    Das berücksichtigt aber keine Schaltsekunden.



  • ipsec schrieb:

    volkard schrieb:

    Mit Sekunden schaffe ich es.

    sekundenSeitMitternacht = sekundenSeit01011971Um00h % (60*60*24);
    

    Das berücksichtigt aber keine Schaltsekunden.

    Naja, time() hat wohl auch keine Schaltsekunden reinsummiert.



  • ipsec schrieb:

    volkard schrieb:

    Mit Sekunden schaffe ich es.

    sekundenSeitMitternacht = sekundenSeit01011971Um00h % (60*60*24);
    

    Das berücksichtigt aber keine Schaltsekunden.

    time_t , sowie die meisten anderen im Computerbereich üblichen skalaren Zeitformate, kennt keine Schaltsekunden. Daher gibt es da auch keine zu berücksichtigen.

    Wenns dich interessiert, hier steht ein bisschen was zu dem Thema:
    http://www.boost.org/doc/libs/1_53_0/doc/html/date_time/details.html#date_time.tradeoffs



  • Ok, anscheinend funktioniert es, aber ich muss doch nochmal nachfragen:

    Nehmen wir an, wir schrieben den 2. Januar 1970, 1 Uhr. time() gibt also 1 Tag und 1 Stunde in Sekunden zurück. Das mod 60*60*24 gibt wieder 1 Stunde. So weit so gut.
    Wenn es nun zufällig am 1. Januar 1970 eine Schaltsekunde gegeben hätte, hätten wir es erst 0:59:59 Uhr. time() gibt aber den gleichen Wert wie vorher zurück. Oder nicht?

    Zumindest müsste man nochmal dazu sagen, was genau die „vergangene Zeit“ ist.



  • Hier steht genau was dann passiert:
    http://en.wikipedia.org/wiki/Unix_time#Encoding_time_as_a_number

    Kurzfassung:
    Wenn eine Schaltsekunde "ausgelassen" wird, dann springt time_t von 23:59:58.999 auf 00:00:00.000 -- lässt also diese eine Sekunde aus.

    Und wenn eine Schaltsekunde "eingeschoben" wird, dann springt time_t von 23:59:59.999 auf 23:59:59.000 -- wiederholt also eine Sekunde.

    So zumindest laut Standard.
    Real wird es hoffentlich so umgesetzt wie auch die Zeitkorrektur beim Angleich an Time-Server umgesetzt wird, nämlich dass die Uhr dann nach Mitternacht ein paar Minuten lang eine Spur schneller bzw. eine Spur langsamer läuft.

    Das bedeutet dass time_t nicht geeignet ist um genaue Messungen von Zeitspannen zu machen. Dafür aber stabil und predictable und so fort.

    Siehe die "such dir 2 von 3 aus" Liste aus dem bereits von mir geposteten Link:
    http://www.boost.org/doc/libs/1_53_0/doc/html/date_time/details.html#date_time.tradeoffs

    Für time_t :
    * exact agreement with wall-clock time - JA
    * accurate math, e.g. duration calculations - NEIN
    * ability to handle timepoints in the future - JA


Log in to reply