Я сталкиваюсь с несоответствиями, выполняя следующую команду на разных установках Ruby:
Time.utc(2099, 12, 31, 23, 59, 59)
В некоторых системах я получаю ошибку, в некоторых - действительный ответ.
Есть идеи, почему это может быть?
Класс Ruby Time определяет свои максимальные и минимальные значения в зависимости от размера типа платформы time_t. Следующее из файла Ruby's time.c:
time_t
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. Попытка определить время на такой платформе приведет к ошибке «время вне диапазона».