Ruby Time.utc descrepencies - PullRequest
       9

Ruby Time.utc descrepencies

2 голосов
/ 08 февраля 2010

Я сталкиваюсь с несоответствиями, выполняя следующую команду на разных установках Ruby:

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

В некоторых системах я получаю ошибку, в некоторых - действительный ответ.

Есть идеи, почему это может быть?

1 Ответ

2 голосов
/ 08 февраля 2010

Класс Ruby Time определяет свои максимальные и минимальные значения в зависимости от размера типа платформы time_t. Следующее из файла Ruby's 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 бита, что позволит представить ваше время 31 декабря 2009 года. На старых платформах (включая компилятор Microsoft Visual C ++ .NET 2003) time_t имеет размер только 32 бита, что дает максимально возможное значение от 19 января 2038 03:14:07 UTC. Попытка определить время на такой платформе приведет к ошибке «время вне диапазона».

...