2017-03-14 10 views
1

ローカル時間を(少なくとも現在のタイムゾーンを考慮して)少なくともミリ秒精度で取得するには、できるだけ速く行う必要があります。現地時間をミリ秒単位で取得する

gettimeofday()の使用を避けたいですが、廃止された機能です。

だから、clock_gettime(CLOCK_REALTIME, ...)を使用して時間を現在のタイムゾーンに調整する必要があるようですが、どうすればよいですか?そして、それを行うための最善のポイントはどこですか? clock_gettimeで取得したタイムスタンプを保存する前に、または前に現在のタイムゾーンのグレゴリオ暦で変換する前に?

編集:私の元のサンプルはget_clockとlocaltimeに参加しました - これに到達するより良い方法がありますか?

#include <time.h> 
#include <stdio.h> 

int main() { 
    struct timespec ts; 
    clock_gettime(CLOCK_REALTIME, &ts); 

    struct tm* ptm; 
    ptm = localtime(&(ts.tv_sec)); 

    // Tenths of milliseconds (4 decimal digits) 
    int tenths_ms = ts.tv_nsec/(100000L); 

    printf("%04d-%02d-%02d %02d:%02d:%02d.%04d\n", 
     1900 + ptm->tm_year, ptm->tm_mon + 1, ptm->tm_mday, 
     ptm->tm_hour, ptm->tm_min, ptm->tm_sec, tenths_ms); 
} 

答えて

2

はい、これは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_in_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 

    printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n", 
      (intmax_t)s, ms); 
} 

あなたの目標は、経過時間を測定することで、あなたのシステムが「単調時計」オプションをサポートしている場合は、あなたが使用することを検討すべきですCLOCK_REALTIMEの代わりにCLOCK_MONOTONIC

もう一度、コードをコンパイルしようとすると、-lmフラグが含まれていることを覚えておいてください。

タイムゾーンを取得するには、単に次のようにします。

#define _GNU_SOURCE /* for tm_gmtoff and tm_zone */ 

#include <stdio.h> 
#include <time.h> 

int main(void) 
{ 
    time_t t = time(NULL); 
    struct tm lt = {0}; 

    localtime_r(&t, &lt); 

    printf("Offset to GMT is %lds.\n", lt.tm_gmtoff); 
    printf("The time zone is '%s'.\n", lt.tm_zone); 

    return 0; 
} 

注:time()によって返さエポック秒GMT(グリニッジ標準時)であるかのように測定されています。

+0

しかし、現在のタイムゾーン調整はどうですか? – Luciano

+0

タイムゾーンに関連する質問に対して自分の回答を編集しました。タイムゾーンを取得するコードを提供します。あなたの要件に合わせて調整する方法は、練習としてあなたに任せます。 – iqstatic

+0

ありがとうございます。私はオリジナルのテストを表示するために質問を編集しました。私はこの質問をする意欲がありました。 – Luciano