Holen Sie Unterschied zwischen zwei time_t in tm mit der richtigen tm_mday
Abhängig von der Menge der Eingabedaten, ich habe ein Programm, das ausgeführt wird in Sekunden oder Tagen. Am Ende von meinem Programm, ich will zu drucken, die verstrichene "clock wall" - Zeit: in Sekunden, wenn es ist weniger als eine minute, in min und sec wenn es ist weniger als eine Stunde, Stunde -, min-Sek, wenn es weniger als einen Tag, und Tag-Stunde-min-sec sonst. Hier ist der code, den ich verwende:
#include <cstdio>
#include <ctime>
#include <unistd.h> //for sleep
int main (int argc, char ** argv)
{
time_t startRawTime, endRawTime;
time (&startRawTime);
printf ("%s", ctime (&startRawTime));
sleep (3); //any preprocessing of input data
time (&endRawTime);
printf ("%s", ctime (&endRawTime));
printf ("%.0fs\n", difftime (endRawTime, startRawTime));
time_t elapsed = static_cast<time_t>(difftime (endRawTime, startRawTime));
struct tm * ptm = gmtime (&elapsed);
printf ("%id %ih %im %is\n", ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
return 0;
}
Hier ist, was es gibt:
Mon Apr 9 14:43:16 2012
Mon Apr 9 14:43:19 2012
3s
1d 0h 0m 3s
Natürlich die Letzte Zeile falsch ist (es sollte "0d"). Es scheint, es kann einfach gelöst werden durch den Druck ptm->tm_mday - 1
. Allerdings ptm->tm_mday
wird auch "1" ist, wenn es wirklich war ein Tag vergangen zwischen den beiden Daten. Und so in diesem Fall, ich will nicht, um es als angezeigt "0d".
Also gibt es eine Möglichkeit das zu handhaben, richtig? Oder sollte ich das Ergebnis bekommen, das der difftime
als verdoppeln (das heißt, als eine Anzahl von Sekunden) und dann berechnen Sie mir die Anzahl der sec/min/Stunden/Tage?
Bemerkung: mein code wird nur auf Linux, kompiliert mit gcc -lstdc++
.
- "kompiliert mit gcc -lstdc++" -- Warum nicht
g++
statt? Es kümmert sich um herauszufinden, welche Optionen für C++ - code kompilieren. - Das ist wirklich zu missbrauchen, die Zeit-Bibliothek. Zum Beispiel eines tm-struct repräsentiert ein bestimmtes Datum, wo tm_mday ist der Tag, der Monat, nicht nur eine Anzahl von Tagen.
<chrono>
ist eine Art sichere Zeit-Bibliothek das wird verhindern, dass Sie von dieser Art von Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
time_t
Wert steht für einen bestimmten moment in der Zeit. Das Ergebnisdifftime
ist das Intervall, in Sekunden, zwischen zwei Momenten. Das ist eine ganz andere Sache.In Ihrem code
difftime()
zurück3.0
, da sind 3 Sekunden zwischen den beiden angegebenen Zeiten. Die Umwandlung dieser zutime_t
gibt Sie einen moment, 3 Sekunden nach Beginn der Epoche; auf den meisten Systemen läuft, werden 3 Sekunden nach Mitternacht MEZ am 1. Januar 1970. Dietm_mday
Wert ist 1, weil das war der erste Tag des Monats.Könnten Sie in der Lage sein, diese Arbeit zu machen, die durch subtrahieren von 1 von der
tm_mday
Wert, datm_mday
ist 1-basiert, anstatt 0-basiert. Aber du wirst immer noch sinnlose Ergebnisse für längere Intervalle. Zum Beispiel ein Intervall von 31,5 Tagen wird Ihnen mittags auf den 1. Februar, denn der Januar hat 31 Tage, das ist nicht relevant für die Informationen, die Sie versuchen zu bekommen.Nur behandeln, das Ergebnis
difftime()
alsdouble
(denn das ist, was es ist) und berechnen die Anzahl der Tage, Stunden, Minuten und Sekunden durch einfache Arithmetik.(Mit etwas Verlust der Beweglichkeit, Sie können nur subract die
time_t
Werte direkt anstattdifftime()
. Machen, dass einige der Arithmetik ein wenig leichter, aber es wird brechen auf Systemen, auf denen eintime_t
Wert ist etwas anderes als eine integer-Anzahl der Sekunden, die seit einige Zeit.difftime()
existiert aus einem Grund.)Nicht richtig; wenn das Zeitintervall wird nur über 1 Tag
ptm->tm_mday
wird2
. Überprüfen kann man das mit einer kleinen änderung, um Ihren code:Wenn ich dieses ändern, bekomme ich diese Ausgabe:
könnte korrigiert werden, indem die Subtraktion von 1 von
ptm->tm_mday
. Aber auch das ist nicht der richtige Ansatz.Hier ist ein Beispiel für die Verwendung der
<chrono>
Bibliothek, eine typesafe-timing-Bibliothek, die verhindert, dass Sie die Art von Fehler, den du machst. In chrono time_points und Dauer sind nicht austauschbar, und wenn Sie versuchen, Sie auf diese Weise dann erhalten Sie den compiler-Fehler.Hinweise für GCC
Älteren Versionen von GCC haben monotonic_clock statt steady_clock. 4.7 hat steady_clock.
Um auf std::this_thread::sleep_for, die Sie haben können, um zu definieren, _GLIBCXX_USE_NANOSLEEP aus irgendeinem Grund.