Wie Systemzeit an eine Zeichenfolge anhängen?
Meine Antwort ist eine Komfortfunktion zu bauen.
Wenn Sie wirklich nur Stunde, Minute, Sekunde brauchen, dann brauchen Sie nicht die relativ langsame localtime(). (Auf der anderen Seite, wenn Sie mehr benötigen, sollten Sie localtime_r() für die Konvertierung bevorzugen).
Für ein eingebettetes System mehrere Verträge zurück, fand ich diese Konvertierung zu einer relativ langsamen Funktion und entschied, es zu vermeiden. Die Algorithmen zur Handhabung von Schalttagen, Jahrhunderten etc. erscheinen einfach genug. Ich vermute, dass ich es als langsam empfand, weil es mehr berechnet, als ich in der Anwendung benötigte, die versuchte, die Konvertierung viele Male pro Sekunde durchzuführen.
Es gibt einen einfacheren (und wahrscheinlich noch schnelleren) Ansatz, der modulare Arithmetik beinhaltet. Es beginnt gleich - mit einer Zeit (0) (und damit vermute ich, was ich hier mache ist in der localtime_r() Funktion 'versteckt'). Seitennotiz 1 - auf meinem älteren Dell, auf dem Ubuntu 15.10 läuft, ist time (0) einfach der schnellste Zugriff auf die Wanduhr, mit einer typischen Dauer von 6 oder 7 ns. Randnotiz 2 - time_t kann sich eines Tages ändern. "Der Wikipedia-Artikel in time_t beleuchtet dies. Unterm Strich ist der Typ von time_t in der C-Spezifikation nicht garantiert."
Der Code, den ich zur Zeit bequem einen Zeitstempel-String erzeugen verwenden:
std::string hhCmmCssGet(time_t tt = 0) // tt has default value
{
time_t now = (tt ? tt : time(0));
static time_t prev = 0;
static char hhmmss[] = "hh:mm:ss";
if (prev != now)
{
prev = now;
const int32_t CST = -6;
int64_t hr = ((now/3600) % 24) + CST; // hr of day, CST offset
if (hr < 0) hr += 24;
uint64_t min = ((now/60) % 60); // min of day
uint64_t sec = (now % 60); // sec of day
std::stringstream ss;
ss << std::dec
<< std::setfill('0') << std::setw(2) << hr << ":"
<< std::setfill('0') << std::setw(2) << min << ":"
<< std::setfill('0') << std::setw(2) << sec;
for (size_t i=0; i<8; i++) // transfer new value
hhmmss[i] = ss.str()[i]; // into static hhmmss
}
std::string retVal(hhmmss);
return(retVal);
}
Die statischen Elemente und „if (! Prev = jetzt)“ -Klausel, diese Funktion tausende Male pro Sekunde aufgerufen ermöglichen werden ... mit viel reduziertem Aufwand. Die Sekunde aktualisiert schließlich nur 1ce pro Sekunde. Beachten Sie, dass std :: stringstream und modulare arithmetische Operationen nur 1 Sekunde pro Sekunde ausführen.
Werfen Sie einen Blick auf strftime, http://www.tutorialspoint.com/c_standard_library/c_function_strftime.htm –