2

異なる Ruby インストールで次のコマンドを実行すると、矛盾が発生します。

Time.utc(2099, 12, 31, 23, 59, 59) 

一部のシステムではエラーが発生し、一部のシステムでは有効な応答が返されます。

なぜこれが考えられるのでしょうか?

4

1 に答える 1

2

time_tRuby 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_t32 ビットしかないため、可能な最大値は 2038 年 1 月 19 日 03:14:07 UTC になります。このようなプラットフォームで時間を作成しようとすると、「範囲外の時間」エラーが発生します。

于 2010-02-08T17:55:42.657 に答える