Linuxで現在の時間をミリ秒単位で取得するにはどうすればよいですか?
これは POSIX clock_gettime
関数を使用して実現できます。
POSIXの現在のバージョンでは、gettimeofday
は 廃止予定 です。これは、仕様の将来のバージョンから削除される可能性があることを意味します。アプリケーションの作成者は、gettimeofday
の代わりにclock_gettime
関数を使用することをお勧めします。
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
の使用を検討する必要があります。
このようなことをしなければなりません:
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
以下はミリ秒単位で現在のタイムスタンプを取得する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
表現はタイムゾーン自体とは無関係であるか影響を受けないため、gettimeofday()のtz
paramを設定する必要はありません。違いは生じません。
また、gettimeofday()
のmanページによると、timezone
構造体の使用は廃止されているため、tz
引数は通常NULLとして指定する必要があります。詳細については、manページを確認してください。
gettimeofday()
を使用して、時間を秒とマイクロ秒で取得します。組み合わせてミリ秒に丸めることは演習として残しておきます。
C11 timespec_get
実装の解像度に丸められたナノ秒まで戻ります。
Ubuntu 15.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 */
};