Probleme mit mktime



  • Hab eine Funktion, die mir die Sekunden seit 1970 liefert:

    #include "time.h"
    
    time_t time_as_sec;
    struct tm timestrct;
    
    timestrct.tm_year = 106; // Jahr - 1900
    timestrct.tm_mon = 2; // Monat - 1;
    timestrct.tm_mday = 28;
    timestrct.tm_hour = 16;
    timestrct.tm_min = 38;
    timestrct.tm_sec = 0;
    
    timestrct.tm_isdst = 0;
    
    time_as_sec = mktime(&timestrct); // Hier kommt eine falsche Zahl
    

    Wenn ich time_as_sec wieder zurückrechne, habe ich leider einen Offset von einer Stunde drin. Lokal (Windows XP) ist die Zeitzone und die Uhrzeit richtig gesetzt. Wo liegt das Problem?



  • Könnte es Probleme mit der Sommerzeit geben? (setz' doch mal tm_isdst auf -1)



  • Nein, leider kein Erfolg. Es ist 8:30 Uhr. Das bedeutet:

    time_t etime;
    struct tm newTime;
    newTime.tm_year = 106;
    newTime.tm_mon = 2;
    newTime.tm_mday = 29;
    newTime.tm_hour = 8;
    newTime.tm_min = 30;
    newTime.tm_sec = 0;
    newTime.tm_isdst = 0;
    
    etime = mktime(&newTime);
    // DEBUG
    int newsecond = etime % 60;
    int newminute = (etime / 60) % 60;
    int newhour = (etime / 3600) % 24;
    // DEBUG
    

    Bei mir ist die Zeitzone auf Berlin gestellt und die Sommerzeit steht auf "automatisch" und tm_isdst auf 0:

    newsecond = 0;
    newminute = 30;
    newhour = 7;
    

    Stell ich tm_isdst auf 1:

    newsecond = 0;
    newminute = 30;
    newhour = 6;
    

    Stell ich tm_isdst auf -1:

    newsecond = 0;
    newminute = 30;
    newhour = 6;
    


  • Erstmal wußte ich gar nicht, daß 2006 ein Schaltjahr war 😉 Und dann wäre es eine Möglichkeit, die übrigen Komponenten deiner struct abzufragen (was steht in tm_gmtoff und tm_zone?)



  • Mmmmhhh... wo sollen die stehen? Ich finde die nicht...



  • Nach meinen Manuals sind das Elemente des struct tm.

    (was auch sein könnte: time_t hat seinen Nullpunkt am 1.1.1970 0:00 UTC - und das entspricht NICHT deiner lokalen Zeit, deswegen steht im tm_gemtoff auch die Differenz zwischen UTC-Zeit und lokaler Zeit)

    Edit: Wenn du nur die Uhrzeit auslesen willst, solltest du lieber direkt auf die Elemente von newTime zugreifen 😉



  • #ifndef _TM_DEFINED
    struct tm {
            int tm_sec;     /* seconds after the minute - [0,59] */
            int tm_min;     /* minutes after the hour - [0,59] */
            int tm_hour;    /* hours since midnight - [0,23] */
            int tm_mday;    /* day of the month - [1,31] */
            int tm_mon;     /* months since January - [0,11] */
            int tm_year;    /* years since 1900 */
            int tm_wday;    /* days since Sunday - [0,6] */
            int tm_yday;    /* days since January 1 - [0,365] */
            int tm_isdst;   /* daylight savings time flag */
            };
    #define _TM_DEFINED
    #endif
    

    So steht es in meiner Windows-TIME.H. Allerdings möchte ich die Funktion auch unter Linux nutzen.



  • Hab es für Windows jetzt so gelöst:

    #include "time.h"
    
    time_t time_as_sec;
    struct tm timestrct;
    
    #ifdef WIN32
    _tzset();
    #endif
    
    timestrct.tm_year = 106;
    timestrct.tm_mon = 2;
    timestrct.tm_mday = 28;
    timestrct.tm_hour = 16;
    timestrct.tm_min = 38;
    timestrct.tm_sec = 0;
    
    timestrct.tm_isdst = 0;
    
    #ifdef WIN32
    time_as_sec -= _timezone;
    #endif
    
    time_as_sec = mktime(&timestrct);
    

    PS: Unter Linux geht es auch ohne Korrektur.



  • Sorry, wenn ich nochmal nerve, aber es die Lösung geht doch nicht.
    Ich brauche eine verlässliche Lösung. Muss nur in Windows (aber kein MFC) und in allen Zeitzonen funktionieren. 😞


Anmelden zum Antworten