Aktuelle Uhrzeit mit Millisekunden ermitteln

74342
Meysam

Ich suche nach einem effizienteren oder kürzeren Weg, um die folgende Ausgabe mithilfe des folgenden Codes zu erzielen:

timeval curTime;
gettimeofday(&curTime, NULL);
int milli = curTime.tv_usec / 1000;

time_t rawtime;
struct tm * timeinfo;
char buffer [80];

time(&rawtime);
timeinfo = localtime(&rawtime);

strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", timeinfo);

char currentTime[84] = "";
sprintf(currentTime, "%s:%d", buffer, milli);
printf("current time: %s \n", currentTime);

Beispielausgabe:

aktuelle Uhrzeit: 16.05.2012 13: 36: 56: 396

Ich würde es vorziehen, keine Drittanbieter-Bibliothek wie Boost zu verwenden.

Antworten
6
Sie möchten "% 03d" verwenden, um "milli" so zu formatieren, dass Sie führende Nullen erhalten. Und da Ihr Format so nahe an ISO-8601 liegt, möchten Sie möglicherweise fortfahren und "." Statt ":" trennen Sie Sekunden und Millisekunden. xan vor 7 Jahren 0

1 Antwort auf die Frage

8
saeedn

Wenn Sie anrufen gettimeofday, erhalten Sie die Anzahl der Sekunden seit EPOCH, sodass Sie nicht timeerneut anrufen müssen . Und wenn Sie die Ausgabe von localtimeals Eingabe von verwenden strftime, können Sie die Zwischenvariable weglassen (kein sehr nützlicher Punkt). So könnte Ihr Code folgendermaßen geschrieben werden:

timeval curTime;
gettimeofday(&curTime, NULL);
int milli = curTime.tv_usec / 1000;

char buffer [80];
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", localtime(&curTime.tv_sec));

char currentTime[84] = "";
sprintf(currentTime, "%s:%d", buffer, milli);
printf("current time: %s \n", currentTime);

Ein wichtiger Hinweis, den Sie beachten sollten, ist, dass Funktionen wie localtimeThread nicht sicher sind und Sie localtime_rstattdessen besser verwenden sollten .

Es ist erwähnenswert, dass unter Windows `timeval :: tv_sec` ein` long` ist, während `localtime` ein` time_t` erwartet. Vielleicht möchten Sie es zuerst explizit in den richtigen Typ konvertieren. Kentzo vor einem Jahr 0
`sprintf (currentTime,"% s:% d ", Puffer, milli);` ist falsch, wenn milli <100 ist. Verwenden Sie `"% s: 03d "`, um das Auffüllen mit Nullen hinzuzufügen. michaelmoo vor einem Jahr 0