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(×trct); // 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(×trct);
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.