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, gettimeofdayyang ditandai usang . Artinya, ini dapat dihapus dari versi spesifikasi yang akan datang. Penulis aplikasi didorong untuk menggunakan clock_gettimefungsi 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_MONOTONICdaripada CLOCK_REALTIME.
gccperintah Anda .
ssaat 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 longrepresentasi waktu tidak relevan atau dipengaruhi oleh zona waktu itu sendiri, maka pengaturan tzparameter gettimeofday () tidak diperlukan, karena tidak akan membuat perbedaan apa pun.
Dan, menurut pria halaman gettimeofday(), penggunaan timezonestruktur adalah usang, sehingga tzargumen biasanya harus ditetapkan sebagai NULL, untuk rincian silahkan periksa halaman manual.
tzparameter gettimeofday()as &(struct timezone tz = {480, 0})tidak akan mendapatkan peringatan apa pun, dan tidak berpengaruh apa pun pada hasilnya, itu masuk akal, karena longrepresentasi waktu tidak relevan atau terpengaruh berdasarkan zona waktu itu sendiri, bukan?
NULLnilai 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.