Hallo, ich versuche aus der aktuellen UTC-Zeit einen UNIX-Zeitstempel zu generieren. Der liegt aber leider immer um eine Stunde daneben. Hier der Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Vermutlich ist der Fehler ganz trivial, aber ich komm einfach nicht drauf...
|
Anzeige
|
C- Unix Zeitstempel immer um 1h falschHallo, ich versuche aus der aktuellen UTC-Zeit einen UNIX-Zeitstempel zu generieren. Der liegt aber leider immer um eine Stunde daneben. Hier der Code:
Vermutlich ist der Fehler ganz trivial, aber ich komm einfach nicht drauf... Sommerzeit? Sommerzeit? http://de.wikipedia.org/wiki/Koordinierte_Weltzeit Gruß, Steffen A. K. schrieb: > Sommerzeit? Operator S. schrieb: > Sommerzeit? UTC-Zeiten kennen doch gar keine Sommerzeit? Normalerweise nimmt man localtime(). Konrad S. schrieb: > Normalerweise nimmt man localtime(). Tut man das? Ich brauche aber die UTC-Zeit, nicht die lokale Zeit ;-) Dann stell deine HW-Clock auf UTC, nicht localtime. ... oder stell die Zeitzone auf UTC. Konrad S. schrieb: > Dann stell deine HW-Clock auf UTC, nicht localtime. Häää? Das abfragen der UTC-Zeit ist doch überhaupt nicht mein Problem.
funktioniert ja wunderbar. Das Problem ist das Generieren des Unix-Zeitstempels. Und stell die Zeitzone von deinem System richtig ein. Dirk B. schrieb: > Und stell die Zeitzone von deinem System richtig ein. Was hat das mit meinem Problem zu tun?
Gast
#3657620
Hi Boris, ich mache da so:
UTC wechselt im Sommer oder Winter die Zeitzone nicht. Aber Achtung: setzte danach wieder auf CET resp. CEST um. Grüsse, René time_t timeNow = time(0); liefert doch schon den UNIX Zeitstempel.
Gast
#3657624
Was dennoch komisch ist, dass Deine Zeit um eine Stunde abweicht. Wir haben jetzt CEST, d.h. Deine Zeit müsste dann um zwei Stunden abweichen. Ist die Systemzeit und Zeitzone richtig eingestellt? Grüsse, René
Gast
#3657625
Sie dir mal die variable tm_isdst in struct tm an. Die ist für die Sommerzeit zuständig. time(0) liefert den Unix-Zeitstempel. Wenn er nicht stimmt, dann hast du deine Uhr nicht richtig auf UTC eingestellt. Laut diesem Link http://www.cplusplus.com/reference/ctime/mktime/ benötigt mktime() als Parameter die Lokale Zeit? Versuchs doch mal damit. time_t timeNow = time(0); tm* localTime = localtime(&timeNow); DWORD unixTimestamp = (DWORD)mktime(localTime); Gruß, Steffen Steffen N. schrieb: > benötigt mktime() als Parameter die Lokale Zeit? Versuchs doch mal > damit. Eigentlich kann man mktime als Parameter jede beliebige Zeit übergeben, nicht zwangsläufig die lokale Zeit. old man schrieb: > Sie dir mal die variable tm_isdst in struct tm an. Die ist für die > Sommerzeit zuständig. Jo, die hab ich auf 0 gesetzt (keine DST), weil ich ja mit UTC Zeiten arbeite. Die Zeit kommt übrigens NICHT von meinem lokalen PC, sondern von einem GPS Empfänger. Was ich also machen möchte ist Folgendes (pseudo-Code): var CurUtcTime = GpsGetCurrentUtcTime(); var UnixTimestamp = mktime(CurUtcTime ); Da liegt aber der Wert immer eine Stunde neben der echten UTC Zeit... Boris P. schrieb: > Eigentlich kann man mktime als Parameter jede beliebige Zeit übergeben, > nicht zwangsläufig die lokale Zeit. Klar. Nur ist mktime per Definition die Umkehrung von localtime, nicht von gmtime. Folglich kann time => gmtime => mktime nur dann die gleiche Timestamp liefern, wenn man sich in der UTC Zeitzone befindet. Boris P. schrieb: > Eigentlich kann man mktime als Parameter jede beliebige Zeit übergeben, > nicht zwangsläufig die lokale Zeit. Naja, die Frage ist ja, wandelt mktime stur die Zeitstruktur, oder schaut er vorher im System nach und korrigiert selbstständig je nach eingestellter Zeitzone? A. K. schrieb: > Klar. Nur ist mktime per Definition der Gegenspieler von localtime, > nicht von gmtime. Dann habe ich mktime vielleicht falsch verstanden? Was ich von der Funktion erwarte ist, dass sie die Anzahl der Sekunden vom 1. januar 1970 bis zum übergebenen Zeitpunkt zurückgibt (also den UNIX-Timestamp). Wo soll denn da die lokale Zeit ins Spiel kommen? Steffen N. schrieb: > Naja, die Frage ist ja, wandelt mktime stur die Zeitstruktur, oder > schaut er vorher im System nach und korrigiert selbstständig je nach > eingestellter Zeitzone? Dafür gibt es ja eigentlich das Flag "tm_isdst". Wenn man das auf 0 stellt, sollte nicht korrigiert werden. (?) http://www.cplusplus.com/reference/ctime/mktime/ "Returns the value of type time_t that represents the local time described by the tm structure pointed by timeptr (which may be modified). This function performs the reverse translation that localtime does." Du fütterst mktime aber nicht mit der lokalen Zeit, sondern mit UTC. Boris P. schrieb: > Dafür gibt es ja eigentlich das Flag "tm_isdst". Wenn man das auf 0 > stellt, sollte nicht korrigiert werden. (?) tm_isdst bestimmt die Berücksichtigung der Sommerzeit, nicht der Zeitzone. A. K. schrieb: > Du fütterst mktime aber nicht mit der lokalen Zeit, sondern mit UTC. OK, das ist dann wohl die Erklärung für das seltsame Verhalten. Danke! In der Doku die ich zu der Funktion herangezogen habe war das leider NICHT erwähnt. Oder ich habs überlesen ;-) Gibt es denn eine Alternative der ich auch eine UTC Zeit übergeben könnte? Also eine Funktion: UTC-Zeit -> UTC-UNIX-Timestamp? Google kaputt? Windows: http://msdn.microsoft.com/de-de/library/2093ets1.aspx Linux: http://linux.die.net/man/3/timegm Wobei ich 'mktime(&tm)-timezone' einfacher finde, und threadsafe ist es auch (vs. timegm). timezone ist übrigens in time.h definiert...
Gast
#3657718
Meist liegt das am persönlichen Standpunkt. Also tatsächlicher Position auf dem Globus bzw. der Zeitzone. Da Computer sehr leichtgläubig sind, kann man auch dort einiges falschmachen. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|