C- Unix Zeitstempel immer um 1h falsch

OP #3657587
Lesenswert?

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
  // Liefert aktuelle UTC Zeit (z.B.  05 / 16 / 14 @ 7:25:26am UTC)
2
  time_t timeNow = time(0);
3
  tm* utcTime = gmtime(&timeNow);
4

5
  // Liefert um 1h falschen UNIX Timestamp (z.B.  05 / 16 / 14 @ 6:25:26am UTC)
6
  DWORD unixTimestamp = (DWORD)mktime(utcTime);

Vermutlich ist der Fehler ganz trivial, aber ich komm einfach nicht 
drauf...
Gast #3657624
Lesenswert?

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é
OP #3657635
Lesenswert?

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...
OP #3657647
Lesenswert?

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. (?)
OP #3657657
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren