Linuxの現在時刻をミリ秒単位で取得するにはどうすればよいですか?
回答:
これは、POSIXclock_gettime
関数を使用して実現できます。
POSIXの現在のバージョンでは、廃止gettimeofday
とマークされています。これは、仕様の将来のバージョンから削除される可能性があることを意味します。アプリケーション作成者は、のclock_gettime
代わりに関数を使用することをお勧めしますgettimeofday
。
使用方法の例を次に示します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);
}
経過時間を測定することが目標であり、システムが「単調クロック」オプションをサポートしている場合は、のCLOCK_MONOTONIC
代わりにを使用することを検討する必要がありCLOCK_REALTIME
ます。
gcc
。
s
、これが発生したときにインクリメントする必要があります。おそらくまれなイベントですが、余分な数字が問題を引き起こす可能性があります。
以下は、現在のタイムスタンプをミリ秒単位で取得するutil関数です。
#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;
}
タイムゾーンについて:
タイムゾーンを指定するためのgettimeofday()サポート。タイムゾーンを無視するNULLを使用しますが、必要に応じてタイムゾーンを指定できます。
@ Update-タイムゾーン
long
時間の表現はタイムゾーン自体とは関係がないか、影響を受けtz
ないため、gettimeofday()のparamを設定する必要はありません。違いはありません。
また、のmanページによるとgettimeofday()
、timezone
構造体の使用は廃止tz
されているため、引数は通常NULLとして指定する必要があります。詳細については、manページを確認してください。
tz
のPARAMgettimeofday()
として&(struct timezone tz = {480, 0})
警告を取得することはありませんが、して以来、それは、理にかなって結果に影響しません。long
時間の表現はに関連するか、行われませんタイムゾーン自体でね?
NULL
です。そのため、通常は通過する妥当な値のみです。そして、私はテストが物事を証明するための良いアプローチであると常に信じています。
gettimeofday()
時間を秒とマイクロ秒で取得するために使用します。組み合わせてミリ秒に丸めることは、演習として残されています。
C11 timespec_get
実装の解像度に丸められて、最大ナノ秒に戻ります。
すでにUbuntu15.10に実装されています。APIは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 */
};