Bagaimana cara mengetahui waktu saat ini di Linux dalam milidetik?
Jawaban:
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.
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 :
gettimeofday () mendukung untuk menentukan zona waktu, saya menggunakan NULL , yang mengabaikan zona waktu, tetapi Anda dapat menentukan zona waktu, jika perlu.
@Update - zona waktu
Karena long
representasi waktu tidak relevan atau dipengaruhi oleh zona waktu itu sendiri, maka pengaturan tz
parameter gettimeofday () tidak diperlukan, karena tidak akan membuat perbedaan apa pun.
Dan, menurut pria halaman gettimeofday()
, penggunaan timezone
struktur adalah usang, sehingga tz
argumen biasanya harus ditetapkan sebagai NULL, untuk rincian silahkan periksa halaman manual.
tz
parameter gettimeofday()
as &(struct timezone tz = {480, 0})
tidak akan mendapatkan peringatan apa pun, dan tidak berpengaruh apa pun pada hasilnya, itu masuk akal, karena long
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.
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
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
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;
}
clock_gettime
), tambahkan tajuk mana yang diperlukan, dan dengan cara apa jawaban itu menjawab pertanyaan OP. Mengenai CLOCK_MONOTONIC
, saya juga akan merekomendasikan penggunaan makro standar langsung dalam jawaban Anda (dan dalam kode Anda, secara umum) daripada literal.