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.
InformationsquelleAutor tflutre | 2012-04-09
Schreibe einen Kommentar