2016-12-16 4 views
1

Ich bereite die folgende Struktur:Unerwarteter Wert von mktime() zurück

struct tm tDepartureTime; 
tDepartureTime.tm_min = 24; 
tDepartureTime.tm_hour = 13; 
tDepartureTime.tm_mday = 11; 
tDepartureTime.tm_mon = 2 - 1; 
tDepartureTime.tm_year = 2017 - 1900; 

dann verwende ich mktime() die Anzahl der Sekunden zu erhalten.

unsigned long qTime = mktime(&tDepartureTime); 

aber es gibt mir Nummer die Zeitstempel-Äquivalent für 2024.11.09 ist. Wo könnte ein Problem sein?

+0

Haben Sie vor, dass das Datum im Februar 2017 ist? (Die Werte von 'tm_mon' laufen von 0 für Januar bis 11 für Dezember.) –

+0

@ JonathanLeffler, ja Jonathan, es war für Februar gedacht. Wie auch immer, danke, dass du mich benachrichtigt hast. –

+0

OK. Da du "2017 - 1900" geschrieben hast, aber nicht "2 - 1" geschrieben hast, war ich mir nicht sicher, aber es hat deine Frage nicht wesentlich beeinflusst. –

Antwort

3

Einige Felder Ihrer tm Struktur sind nicht initialisiert. Insbesondere sind dies tm_sec, tm_mday, tm_wday, tm_yday und tm_isdst.

Von diesen müssen Sie zumindest manuell tm_sec einstellen. Wenn sein Wert zufällig sehr hoch ist, erklärt das die Zeit weit in die Zukunft. Sie können die gesamte Struktur auch mit Nullen initialisieren, indem Sie die erste Zeile in struct tm tDepartureTime = {0} ändern. Dies ist wahrscheinlich die beste Lösung.

+0

Die Werte 'tm_wday',' tm_yday' sind egal und sind als Nebeneffekt des Aufrufs von 'mktime()' gesetzt. Der Wert wurde für 'tm_mday' festgelegt. Wie Sie richtig gesagt haben, wurde der Wert in 'tm_sec' nicht gesetzt und der tatsächlich vorhandene Wert war wahrscheinlich ziemlich groß. –