Bagaimana cara mengetahui waktu saat ini di Linux dalam milidetik?
89
Ini dapat dicapai dengan menggunakan fungsi POSIXclock_gettime
.
Dalam versi saat ini dari POSIX, gettimeofday
yang ditandai usang . Artinya, ini dapat dihapus dari versi spesifikasi yang akan datang. Penulis aplikasi didorong untuk menggunakan clock_gettime
fungsi tersebut daripada gettimeofday
.
Berikut adalah contoh cara menggunakan 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);
}
Jika tujuan Anda adalah untuk mengukur waktu yang telah berlalu, dan sistem Anda mendukung opsi "jam monotonik", Anda harus mempertimbangkan untuk menggunakan CLOCK_MONOTONIC
daripada CLOCK_REALTIME
.
gcc
perintah Anda .s
saat ini terjadi. Mungkin kejadian langka tetapi digit ekstra dapat menyebabkan masalah.Anda harus melakukan sesuatu seperti ini:
struct timeval tv; gettimeofday(&tv, NULL); double time_in_mill = (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ; // convert tv_sec & tv_usec to millisecond
sumber
Berikut adalah fungsi util untuk mendapatkan stempel waktu saat ini dalam milidetik:
#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; }
Tentang zona waktu :
@Update - zona waktu
Karena
long
representasi waktu tidak relevan atau dipengaruhi oleh zona waktu itu sendiri, maka pengaturantz
parameter gettimeofday () tidak diperlukan, karena tidak akan membuat perbedaan apa pun.Dan, menurut pria halaman
gettimeofday()
, penggunaantimezone
struktur adalah usang, sehinggatz
argumen biasanya harus ditetapkan sebagai NULL, untuk rincian silahkan periksa halaman manual.sumber
tz
parametergettimeofday()
as&(struct timezone tz = {480, 0})
tidak akan mendapatkan peringatan apa pun, dan tidak berpengaruh apa pun pada hasilnya, itu masuk akal, karenalong
representasi waktu tidak relevan atau terpengaruh berdasarkan zona waktu itu sendiri, bukan?NULL
nilai yang masuk akal untuk dilewati. Dan, saya percaya pengujian selalu merupakan pendekatan yang baik untuk membuktikan sesuatu.Gunakan
gettimeofday()
untuk mengetahui waktu dalam detik dan mikrodetik. Menggabungkan dan membulatkan ke milidetik tersisa sebagai latihan.sumber
C11
timespec_get
Ini mengembalikan hingga nanodetik, dibulatkan ke resolusi implementasi.
Ini sudah diterapkan di Ubuntu 15.10. API terlihat sama dengan 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 */ };
Detail lebih lanjut di sini: https://stackoverflow.com/a/36095407/895245
sumber
Berasal dari jawaban POSIX Dan Moulding, ini seharusnya berfungsi:
#include <time.h> #include <math.h> long millis(){ struct timespec _t; clock_gettime(CLOCK_REALTIME, &_t); return _t.tv_sec*1000 + lround(_t.tv_nsec/1.0e6); }
Juga seperti yang ditunjukkan oleh David Guyon: kompilasi dengan -lm
sumber
Versi ini tidak membutuhkan pustaka matematika dan memeriksa nilai kembalian clock_gettime ().
#include <time.h> #include <stdlib.h> #include <stdint.h> /** * @return milliseconds */ uint64_t get_now_time() { struct timespec spec; if (clock_gettime(1, &spec) == -1) { /* 1 is CLOCK_MONOTONIC */ abort(); } return spec.tv_sec * 1000 + spec.tv_nsec / 1e6; }
sumber
clock_gettime
), tambahkan tajuk mana yang diperlukan, dan dengan cara apa jawaban itu menjawab pertanyaan OP. MengenaiCLOCK_MONOTONIC
, saya juga akan merekomendasikan penggunaan makro standar langsung dalam jawaban Anda (dan dalam kode Anda, secara umum) daripada literal.