web-dev-qa-db-ja.com

LinuxのCから現在の時間をミリ秒単位で取得する方法は?

Linuxで現在の時間をミリ秒単位で取得するにはどうすればよいですか?

82
LLL

これは 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の使用を検討する必要があります。

92
Dan Moulding

このようなことをしなければなりません:

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
56
yadab

以下はミリ秒単位で現在のタイムスタンプを取得する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ページを確認してください。

30
Eric Wang

gettimeofday() を使用して、時間を秒とマイクロ秒で取得します。組み合わせてミリ秒に丸めることは演習として残しておきます。

12
Donal Fellows

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 */
};

詳細はこちら: https://stackoverflow.com/a/36095407/895245