Antworten:
Dies kann mit der POSIX-clock_gettime
Funktion erreicht werden.
In der aktuellen Version von POSIX gettimeofday
ist dies als veraltet markiert . Dies bedeutet, dass es möglicherweise aus einer zukünftigen Version der Spezifikation entfernt wird. Anwendungsschreiber werden aufgefordert, die clock_gettime
Funktion anstelle von zu verwenden gettimeofday
.
Hier ist ein Beispiel für die Verwendung clock_gettime
:
#define _POSIX_C_SOURCE 200809L
#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
void print_current_time_with_ms (void)
{
long ms; // Milliseconds
time_t s; // Seconds
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
s = spec.tv_sec;
ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
if (ms > 999) {
s++;
ms = 0;
}
printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n",
(intmax_t)s, ms);
}
Wenn Sie die verstrichene Zeit messen möchten und Ihr System die Option "monotone Uhr" unterstützt, sollten Sie die Verwendung von CLOCK_MONOTONIC
anstelle von in Betracht ziehen CLOCK_REALTIME
.
gcc
Befehl.
s
in diesem Fall inkrementieren . Wahrscheinlich ein seltenes Ereignis, aber die zusätzliche Ziffer kann Probleme verursachen.
Im Folgenden finden Sie die Util-Funktion zum Abrufen des aktuellen Zeitstempels in Millisekunden:
#include <sys/time.h>
long long current_timestamp() {
struct timeval te;
gettimeofday(&te, NULL); // get current time
long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds
// printf("milliseconds: %lld\n", milliseconds);
return milliseconds;
}
Über die Zeitzone :
gettimeofday () Unterstützung zur Angabe der Zeitzone, ich verwende NULL , die die Zeitzone ignorieren, aber Sie können bei Bedarf eine Zeitzone angeben.
@ Update - Zeitzone
Da die long
Darstellung der Zeit für die Zeitzone selbst nicht relevant ist oder von tz
dieser beeinflusst wird, ist es nicht erforderlich, den Parameter gettimeofday () festzulegen, da dies keinen Unterschied macht.
Und nach Mann Seite gettimeofday()
, die Verwendung der timezone
ist Struktur obsolet, so die tz
Argumentation sollte normalerweise als NULL angegeben werden, für Details überprüfen Sie bitte die Manpage.
tz
Parameter von gettimeofday()
as &(struct timezone tz = {480, 0})
nicht gewarnt wurde, und es hat keine Auswirkung auf das Ergebnis, was sinnvoll ist, da die long
Darstellung der Zeit für oder beeinflusst nicht relevant ist nach Zeitzone selbst, richtig?
NULL
der angemessene Wert zu übergeben. Und ich glaube, Testen ist immer ein guter Ansatz, um Dinge zu beweisen.
Verwenden Sie gettimeofday()
diese Option , um die Zeit in Sekunden und Mikrosekunden abzurufen. Das Kombinieren und Runden auf Millisekunden bleibt als Übung übrig.
C11 timespec_get
Es gibt bis zu Nanosekunden zurück, gerundet auf die Auflösung der Implementierung.
Es ist bereits in Ubuntu 15.10 implementiert. Die API sieht genauso aus wie die POSIX clock_gettime
.
#include <time.h>
struct timespec ts;
timespec_get(&ts, TIME_UTC);
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
Weitere Details finden Sie hier: https://stackoverflow.com/a/36095407/895245