web-dev-qa-db-ja.com

time_tとはどのようなプリミティブデータ型ですか?

time_tのデータ型がわかりません。それはフロートダブルか何かですか?表示したい場合は、printfに対応するタグが必要だからです。 time_tを表示するためにそこから残りを処理できますが、それに対応するデータ型を知る必要があります。

46
thyrgle

残念ながら、完全な移植性はありません。通常は整数ですが、 可能 任意の「整数型または実浮動型」です。

28

プラットフォーム固有です。ただし、既知の型にキャストできます。

printf("%lld\n", (long long) time(NULL));
33
dan04

関数difftimeを使用できます。指定された2つのtime_t値の差を返し、出力値はdoubleです( difftime documentation を参照)。

time_t actual_time;
double actual_time_sec;
actual_time = time(0);
actual_time_sec = difftime(actual_time,0); 
printf("%g",actual_time_sec);
15
user2483388

Mktimeのようなものを使用して既知の時間(深夜、昨夜)を作成し、difftimeを使用して2つの間の倍精度の時間差を取得できます。プラットフォームに依存しないソリューションの場合、ライブラリの詳細を掘り下げない限り、それ以上のことをするつもりはありません。 C仕様によると、time_tの定義は実装定義です(つまり、ライブラリの各実装は、使用するライブラリ関数が仕様に従って動作する限り、好きなように定義できます)。

そうは言っても、私のLinuxマシンのtime_tのサイズは8バイトで、これはlong intまたはdoubleを示唆しています。だから私はやった:

int main()
{
    for(;;)
    {
        printf ("%ld\n", time(NULL));
        printf ("%f\n", time(NULL));
        sleep(1);
    }
    return 0;
}

%ldで指定された時間は各ステップで1つずつ増加し、フロートは毎回0.000を印刷しました。 printfを使用してtime_tsを表示するのに苦労している場合、最善の方法は、独自のこのような実験を試して、プラットフォームおよびコンパイラでどのように動作するかを確認することです。

2