Problem mit time.h
-
Hallo,
ich lese einen File aus und entnehme diesem File eine Startzeit. Diese lege ich in der Struktur tm (von time.h) ab.
(time.tm_min = 2;...)Danach kommt eine while Schleife, welche die Zeit hochzaehlen soll.
vereinfachtes Bsp:
struct tm times; ...//initialisieren while(1) { //Zeit erhoehen times.tm_sec=times.tm_sec+2; cout << times.tm_min << ":" << times.tm_sec << endl; }
leider zaehlt er die Sukunden auch ueber 60 einfach hoch.
Ich hatte gehofft das er bei Sekunde 60 die Minuten erhoeht.Wenn time.h diese Funktion nicht bietet, koennte ich die zahlen ja gleich in int abspeichern.
Weis jemand eine Loesung dafuer?
(mit if Abfragen waere klar, allerdings muss dann auch Minute, Stunde, Tag, usw abgefragt werden)
-
shorie77 schrieb:
Wenn time.h diese Funktion nicht bietet, koennte ich die zahlen ja gleich in int abspeichern.
natürlich. woher soll denn eine struktur wissen, wie sie die daten interpretieren soll, die sie beinhaltet?
-
das stimmt natuerlich...gibt es es denn irgendeine Funktion, welceh dies ueberprueft?
danke schonmal
-
wenn's dir nur ums hochzählen geht, wähle die kleinste einheit (z.b. sekunden) und inkrementiere diese wie gewohnt. den rest erhälst du leich über modulo divisionen.
z.b.unsigned int sec = 45634; hours = sec / 3600; mins = (sec%3600)/60; secs = (sec%3600)%60;
-
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!