time(): Sekunden eines bestimmten Datums ermitteln
-
Hallo Zusammen,
mit der Funktion time() kann ich ja die Sekunden eines Datums seid 1.1.1970 ermitteln.Mit
time_t Zeitstempel; tm *EinzelDatum; Zeitstempel = time(0); EinzelDatum = localtime(&Zeitstempel); tag = EinzelDatum->tm_mday; monat = EinzelDatum->tm_mon+1; jahr = EinzelDatum->tm_year+1900; stunde = EinzelDatum->tm_hour; minute = EinzelDatum->tm_min;ermittel ich die Sekunden des aktuellen Datums. Ich möchte aber gerne von einem vorgegebenen Datum die Sekunden ermitteln. Z.B. vom 1.4.2005 8:00. Wie kann ich das machen? An welcher Stelle muß ich mein Datum und die Uhrzeit angeben?
Danke im voraus
EPMS
-
versuch's mal mit man: difftime (als ersten Wert gibt du die Rückgabe von time() an, für den zweiten Wert kannst du ein passend gefülltes "struct tm" durch mktime() jagen).
-
Wenn ich difftime richtig verstehe bekomme ich doch da den Wert zwischen zwei Datums oder?
Ich brauche aber die Sekunden vom 1.1.1970 bis z.B. 1.4.2005.
Mit time(0) bekomme ich ja die Sekunden vom 1.1.1970 bis zum aktuellen Datum. Kann ich bei time() vielleicht ein anderes Datum angeben?
-
EPMS schrieb:
Ich brauche aber die Sekunden vom 1.1.1970 bis z.B. 1.4.2005.
Achso meinst du das - dafür reicht ein einfacher mktime()-Aufruf:
struct tm date; //fülle die Elemente von date: date.tm_mday = 1; date.tm_mon = 4; date.tm_year = 105; ... cout << mktime(&date) << " Sekunden seit 1.1.1970." << endl;
-
Das sieht schonmal nicht schlecht aus. Leider kommt da der falsche Sekundenwert raus.
Wenn ich es so mache wie du geschrieben hast kommt das als Sekundenanzahl:
1114948965 Sekunden
raus. Das wäre dann aber nicht der 01.04.2005 sonder es ist
01.05.2005 - 14:02
Woran könnte das liegen?
-
Pack dir einen Debugger und schau nach, was für Werte in den übrigen Elementen von date stehen - möglicherweise sind die Felder noch nicht initialisiert (und enthalten Datenmüll).
(PS: Die Lösung lautet vermutlich: "struct tm date={0};")
-
So, habe es mir im Debugger mal angeschaut. Vorher allerdings deinen Tipp mit dem date={0} noch eingefügt.
Dabei ist date() richtig gefüllt. kommt als Sekundenzahl
1114902000
raus.
Das wäre dann aber der
01.05.2005 - 01:00
Ist also immer noch falsch.
Woran könnte das denn noch liegen?
-
Zeitzonen? Der Startwert (t=0) ist in Greenwich-Zeit, nicht in MEZ.
-
Wie ändere ich denn die Zeitzone? Zumal es mit der Zeitzone doch nichts zu tun haben kann denn ich habe es folgendermaßen gemacht:
date.tm_mday = 1; date.tm_mon = 4; date.tm_year = 105; date.tm_hour = 0; date.tm_min = 0; date.tm_sec = 0;Demnach ist die Sekundenanzhal um einen Monat und eine Stunde falsch. Die eine Stunde könnte ja an der Zeitzone liegen. Aber was ist mit dem Monat?
-
Hallo nochmals,
hat vielleicht sonst jemand eine Lösung woran es liegen könnte? Oder wie ich mein Problem beheben könnte?
-
EPMS schrieb:
Wie ändere ich denn die Zeitzone?
setz mal tm_gmtoff auf die Differenz zu GMT (müsste +/- 3600 sein).
Aber was ist mit dem Monat?
*nochmal die Manuals durchliest*
int tm_mon; /* month of year (0 - 11) */^ offenbar werden die Monate ab Januar = 0 gezählt.