Problem mit time.h
-
hmm joa...gut also gibt es wohl keine Funktion die dies fuer mich erledigt...
das waere natuerlich sehr konfortabel, denn ich lese mit dem Programm auch mal bis zu 36h Daten ein, das heisst es muss sogar ein Jahreswechsel vorgesehen werden. Und das alles ab Startzeit.
Aber ok danke trotzdem fuer die Hilfe.
-
Du könntest auch ein time_t nehmen und es dann in eine tm Struktur umwandeln lassen:
#include <ctime> int main() { std::time_t time; // Initialisieren mit den Sekunden seit dem 1.1.1970 (Stichwort: Unix Timestamp) while(/*...*/) { time += 2; // oder was auch immer. } // Umwandeln in eine tm Struktur, zum Beispiel als localtime: std::tm* timeStruct = std::localtime(time); // Und nun was anderes machen ... return 0; }
Oder du verwendest eine andere Bibliothek, zum Beispiel Boost.DateTime.
Grüssli
-
mktime() gibt auch "falsche" Zeiten normalisiert zurück (also eine Struktur, die den 40. Oktober enthält liefert einen Timestamp zum 9. November).
Ich würde aber auch sothis_' Rat folgen und - solange nur eine Zeitrepräsentation nötig ist, die Sekunden zählen und modulodividieren (?). Wenn Du einen time_t vorliegen hast und auch Datumsangaben brauchst, kannst Du den bei Bedarf mit localtime() umwandeln.
-
Richtig, wenn du was eigenes basteln willst, musst du auch Schaltjahre berücksichtigen. Das macht die Sache nur unnötig kompliziert, also versuch soweit es geht vorgefertigte Funktionen zu nutzen.
-
Schaltsekunden nicht vergessen, wenn man denn mit UTC arbeiten möchte.
-
perfekt LordJaxom,
also so wie Du die mktime Funktion beschreibst ist das es exakt was ich gesucht habe, leider Funktioniert sie bei mir irgendwie nicht.
Ich bekomme wieder eine Ausgabe von 0min 64 sekunden (usw)
times.tm_sec=times.tm_sec+2; cout << times.tm_min << ":" << times.tm_sec << endl; mktime(×);
oder stimmt was bei mir nicht???
vielen dank fuer die schnellen hilfen
-
Naja, also klar sollte schon sein, dass man zuerst eine Funktion aufrufen muss, die etwas ändert, damit sich etwas geändern haben kann.
Aber Du hast mich falsch verstanden: mktime ändert nicht die tm-Struktur, sondern berücksichtigt eventuelle Überläufe innerhalb der tm-Struktur beim time_t, welches es zurückgibt. Auf Dein Beispiel angewendet müsste das so aussehen:
times.tm_sec = 60; times.tm_sec = times.tm_sec + 2; time_t stamp = mktime( × ); tm* newtimes = localtime( &stamp ); cout << newtimes .tm_min << ":" << newtimes .tm_sec << endl;
Deshalb der Rat, immer mit time_t zu rechnen, und nur bei Bedarf (zur Anzeige) in tm umzuwandeln.
-
ja alles klar...
super habe das probiert und es funktioniert mit der time_t wirklich super!
vielen dank an alle!
-
jetzt habe ich da doch noch ein Problem...
wie bekomme ich die exakte sekunden zahl von einem bestimmten datum (zb 3.6.2008 23:00:00) raus?
ich meine die berechnung ist ja wie bereits erwaehnt sehr muehsam (wegen schaltjahren). gibt es denn eine Funktion dafuer?: ich finde einfach keine.
oder gibt es eine Funktion welche von tm nach t_time konvertiert? hatte da schon mktime getestet bekomme aber immer -1 zurueck.in tm vorhanden: tm_mday ; tm_mon ; tm_year ; tm_hour ; tm_min ; tm_sec
ich will nicht wieder den wochentag berechnen.
-
Ja, genau das macht mktime. Hast Du vorher die unbenutzten Felder der tm-Struktur genullt (wday, yday und isdst)?
-
ok das hatte ich nicht. habe das jetzt probiert und bekomme aber leider immernoch -1...
also einmal nullen mit 0 und einmal mit NULL...bringt leider beides nichts
eine idee?
-
Sonst alle Fallen von tm beachtet?
#include <time.h> #include <stdio.h> int main() { struct tm times = { 0 }; times.tm_hour = 23; times.tm_mday = 3; times.tm_mon = 5; // monat ist 0-11! times.tm_year = 108; // jahr ist minus 1900! printf("%d\n", mktime(×)); }
-
ohh man...
stimmt...ich hatte vergessen -1900 zu machen.
Vielen Dank!!
warst mir eine riesen Hilfe!