time_t

読み:タイム・ティー
外語:time_t 英語
品詞:名詞

ANSI CやC++で時刻を表わす型。The Epochからの秒数で表現する。

C

#include <time.h>

定義は後述。

C++

C++では、std::time_tである。

#include <ctime>

namespace std {

typedef 処理系依存 time_t;

}

定義は後述。

_tで終わる型は大抵はシステムデータ型で、必ずどこかでtypedefされている。元がどのような型であるかは、実装に委ねられている。

従来の実装では32ビット符号付き整数型(signed long int)だが、これは2038年問題を起こすため、2000年問題が騒がれはじめた頃から順次64ビット化が進められている。

これが、signed longではなくtime_tとしているのは、このようにサイズが変わった時にも対応できるようにした保険の一つである。

Visual C++ 6

古いVC++に限らず、古い処理系は概ね同じ。

Microsoft Visual C++ 2003

Microsoft Visual C++ 2003環境では、次のように定義される。

  • typedef _W64 long time_t; (Win32)
  • typedef __int64 time_t; (Win64)

つまりWin32環境では31ビット長、Win64環境では63ビット長である(有効桁数が1ビット足りないのは符号があるため)。

_W64は、Visual C++ 32bitの場合__w64キーワードに展開される。これは、/Wp64を指定した時に、64ビット対応の型であると指定するものである。

Microsoft Visual C++ 2005/2008

Microsoft Visual C++ 2005/2008環境でも同様であるが、若干定義が異なる。

  • (crtdefs.h) typedef __int64 __time64_t;
  • (crtdefs.h) typedef __time64_t time_t;

Win32環境でも__int64は利用可能で、もってtime_tは64ビット化されている。

64ビットtime_tは、1970+0x7fffffffffffffff年までの時刻表現が保証される。

閏年が存在しないと仮定すると、2924億7121万647年の途中までが表現可能である。

つまり、64ビット化は、単に問題を3000億年ほど先送りしたに過ぎず、後々問題が発生する可能性があり、これを「292471210647年問題」という。なお、これは宇宙の年齢(約137億年)の21倍程度という年月に相当する。