mktime - gleiche Eingabe andere Ausgabe
-
Hey,
mein mktime rechnet immer eine Stunde zu viel aus (im Vergleich zu time(NULL)). Erst hab ich gedacht das es irgendwie an der Zeitzone liegt, also hab ich mir ein paar Testausgaben gleich am Anfang meiner main-Methode geschrieben. Und siehe da: hier wird keine Stunde drauf gerechnet, nur im weiteren Programmverlauf. Hier mal der Code der Main und im Programm:
//in der main char *str = new char[20]; time_t now = time(NULL); struct tm *tm = localtime(&now); sprintf(str, "%02i.%02i.%04i %02i:%02i:%02i", tm->tm_mday, tm->tm_mon+1, tm->tm_year+1900, tm->tm_hour, tm->tm_min, tm->tm_sec); cout << str << endl; if (strptime(str, "%d.%m.%Y %H:%M:%S", tm) != NULL){ printf("%02i.%02i.%04i %02i:%02i:%02i\n", tm->tm_mday, tm->tm_mon+1, tm->tm_year+1900, tm->tm_hour, tm->tm_min, tm->tm_sec); time_t now2 = mktime(tm); cout << now2 << " - " << now << " = " << now2-now << endl; } delete str;erzeugt folgendes an Output:
17.07.2011 20:58:40 17.07.2011 20:58:40 1310929120 - 1310929120 = 0//im Programm void TexifDataInput::inputTime(string display, time_t &timedif){ bool finished = false; while (!finished){ cout << endl << "Zeit für \"" << display << "\" eingeben (Format: dd.mm.yyyy hh:mm:ss, x: abbrechen):" << endl; string input; getline(cin, input); if (input.length() >= 1 && input[0] == 'x'){ cout << "Die Eingabe wurde abgebrochen..." << endl; finished = true; }else{ struct tm tm; if (strptime(input.c_str(), "%d.%m.%Y %H:%M:%S", &tm) != NULL){ time_t t1 = mktime(&tm), t2 = time(NULL); timedif = t1 - t2; cout << t1 << "-" << t2 << " = " << timedif << endl; finished = true; }else{ cout << "Die eingegebene Zeit ist ungültig. Bitte erneut eingeben." << endl; } } } }erzeugt folgendes an Output:
17.07.2011 20:58:40 1310932720 - 1310929217 = 3503Ich hab dann natürlich gründlich nach einem Fehler gesucht und paar Sachen im Code geändert und auf einma hats funktioniert. Dann hab ich noch ein paar Sachen ergänzt und auf einma ging wieder nix mehr. Ich kann das aber auch nicht wirklich reproduieren. Ich bin grad irgendwie ratlos

Hätte jmd die Güte mich zu erleuchten?MfG & Thx Bergmann.
-
Anscheinend wird bei dir die Sommerzeit nicht korrekt erkannt (=1h in unserer Zeitzone, bzw. +2 zur UTC-Zeit). Im Unterschied zur main-Funktion solltest du auch in der inputTime-Funktion die aktuelle Zeit über localtime beziehen. Evtl. löst das dein Problem schon.
time_t t2; time ( &t2 ); tm* tm2 = localtime ( &t2 );http://www.cplusplus.com/reference/clibrary/ctime/tm/
So richtig schön sind die C-Klassen leider nicht. Wenn du viel mit Zeiten tun musst, dann solltest du dir lieber einmal die boost::date_time Klassen anschauen. So verfügt boost::date_time::local_date_time zusätzlich die Zeitzone.
-
so. jetzt habe ich auch einen Compiler vorliegen (war gestern zu faul dazu es in XCode zu kopieren).
1. Verwende nie den Namen einer Struktur als Variablennamen (struct tm tm)
2. strptime ist POSIX und kein C/C++ Standard (kann ich hier unter Windows bspw. nicht testen)Okay. Aber der eigentliche Fehler steckt in der fehlenden Sommerzeitinformation bei der manuellen Eingabe (dst-flag, wobei dst=daylight saving time).
Hier das Beispiel reduziert aufs Wesentliche:
//aktuelle Zeit über Systemfunktion time_t aktuelleZeit = time(NULL); tm* pTmLocaltime = localtime(&aktuelleZeit); std::cout << pTmLocaltime->tm_isdst << std::endl; //aktuelle Zeit über manuelle Eingabe tm tmManuell; memset(&tmManuell, 0, sizeof(tmManuell)); //tmManuell initialisieren tmManuell.tm_sec = pTmLocaltime->tm_sec ; tmManuell.tm_min = pTmLocaltime->tm_min ; tmManuell.tm_hour = pTmLocaltime->tm_hour; tmManuell.tm_mon = pTmLocaltime->tm_mon ; tmManuell.tm_year = pTmLocaltime->tm_year; tmManuell.tm_wday = pTmLocaltime->tm_wday; tmManuell.tm_yday = pTmLocaltime->tm_yday; tmManuell.tm_mday = pTmLocaltime->tm_mday; tmManuell.tm_isdst = 0; //wird durch strptime nicht initialisert, da die Zeitzone unbekannt ist std::cout << tmManuell.tm_isdst << std::endl; std::cout << mktime( pTmLocaltime) - mktime(&tmManuell) << std::endl;Die Ausgabe liefer:
1 0 -3600Demzufolge fehlt deiner manuell gesetzten Zeit exakt eine Stunde, also genau die Sommerzeitverschiebung. Im Winter liefert dein Programm also exakte Ergebnisse.

-
Super, jetzt funktionierts. Dankeschön
