異なる Ruby インストールで次のコマンドを実行すると、矛盾が発生します。
Time.utc(2099, 12, 31, 23, 59, 59)
一部のシステムではエラーが発生し、一部のシステムでは有効な応答が返されます。
なぜこれが考えられるのでしょうか?
time_t
Ruby Time クラスは、プラットフォームの型のサイズに基づいて最大値と最小値を定義します。以下は Ruby のtime.c
ファイルからのものです。
#if SIZEOF_TIME_T == SIZEOF_LONG
typedef unsigned long unsigned_time_t;
#elif SIZEOF_TIME_T == SIZEOF_INT
typedef unsigned int unsigned_time_t;
#elif SIZEOF_TIME_T == SIZEOF_LONG_LONG
typedef unsigned LONG_LONG unsigned_time_t;
#else
# error cannot find integer type which size is same as time_t.
#endif
#define TIMET_MAX (~(time_t)0 <= 0 ?
(time_t)((~(unsigned_time_t)0) >> 1) : (~(unsigned_time_t)0))
#define TIMET_MIN (~(time_t)0 <= 0 ?
(time_t)(((unsigned_time_t)1) << (sizeof(time_t) * CHAR_BIT - 1)) : (time_t)0)
のサイズはtime_t
プラットフォームによって異なります。最新のプラットフォームのほとんどtime_t
は 64 ビットで、2009 年 12 月 31 日の時刻を表すことができます。古いプラットフォーム (Microsoft の Visual C++ .NET 2003 コンパイラを含む) ではtime_t
32 ビットしかないため、可能な最大値は 2038 年 1 月 19 日 03:14:07 UTC になります。このようなプラットフォームで時間を作成しようとすると、「範囲外の時間」エラーが発生します。