web-dev-qa-db-ja.com

1970年1月1日からのUTC時間をミリ秒でC言語で取得するにはどうすればよいですか?

C言語でtime.hを使用して1970年からミリ秒とその小数部を取得する方法はありますか?

21
Siddiqui

これはUbuntu Linuxで機能します。

#include <sys/time.h>

...

struct timeval tv;

gettimeofday(&tv, NULL);

unsigned long long millisecondsSinceEpoch =
    (unsigned long long)(tv.tv_sec) * 1000 +
    (unsigned long long)(tv.tv_usec) / 1000;

printf("%llu\n", millisecondsSinceEpoch);

この記事の執筆時点では、上記のprintf()により1338850197035が得られます。 TimestampConvert.com Webサイトで健全性チェックを実行し、値を入力して人間が読める形式に戻すことができます時間(ミリ秒の精度はありません)。

36

ミリ秒単位の解像度が必要な場合は、Posixでgettimeofday()を使用できます。 Windowsの実装については、 Windowsのgettimeofday関数 を参照してください。

#include <sys/time.h>

...

struct timeval tp;
gettimeofday(&tp);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
10
Plow

標準Cではありませんが、gettimeofday()はSysVとBSD派生システムの両方に存在し、POSIXにあります。エポック以降の時間をstruct timeval

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};
6
caf

UnixおよびLinuxの場合、 gettimeofday を使用できます。

Win32の場合、 GetSystemTimeAsFileTime を使用し、次に time_t +ミリ秒に変換 を使用できます。

4
dalle
    // the system time
    SYSTEMTIME systemTime;
    GetSystemTime( &systemTime );

    // the current file time
    FILETIME fileTime;
    SystemTimeToFileTime( &systemTime, &fileTime );

    // filetime in 100 nanosecond resolution
    ULONGLONG fileTimeNano100;
    fileTimeNano100 = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;

    //to milliseconds and unix windows epoche offset removed
    ULONGLONG posixTime = fileTimeNano100/10000 - 11644473600000;
    return posixTime;
2
mede griessen

nix時間またはPosix時間 は、あなたが言及したエポックからのでの時間です。

bzabhi の答えは正しいです。ミリ秒を取得するには、Unixタイムスタンプに1000を掛けるだけです。

Unixタイムスタンプに依存して返されるすべてのミリ秒値は、multiples1000(12345678000など)になることに注意してください。解像度はまだわずか1秒です。

小数部を取得できません

Pavelからのコメントも正しいです。 Unixタイムスタンプでは、うるう秒は考慮されません。これにより、ミリ秒への変換に依存することがさらに賢くなくなります。

1
pavium