32-битный ruby ​​1.9.2p290 Время не выдерживает 2038?

32-битная версия Ruby 1.9.2p290 (которую я должен использовать), кажется, испытывает трудности с добавлением 25 (но не 24!) лет к текущему времени.

now = Time.now
more_time = (24*365*24*60*60)
puts "more_time.class = #{more_time.class}"
later = now + more_time

now = Time.now
more_time = (25*365*24*60*60)
puts "more_time.class = #{more_time.class}"
later = now + more_time

Производит:

more_time.class = Фиксированное число

more_time.class = Фиксированное число

ruby_time.rb:11:in `+': time + 788400000.000000 вне диапазона времени (RangeError) из ruby_time.rb:11

Я столкнулся с проблемой 2038 года? У меня нет этой проблемы с 64-битным рубином 1.9.2-p290.


person CHK    schedule 08.08.2013    source источник


Ответы (1)


32-битный Ruby использует 32 бита для представления времени, поэтому он имеет допустимый диапазон от 13 Dec 1901 20:45:54 UTC до 19 Jan 2038 03:14:07 UTC, так как это минимальное/максимальное целочисленное значение со знаком, представляемое с помощью 32 бит, где время 0 является временем эпохи unix (1 Jan 1970 00:00:00 UTC).

64-битный Ruby использует 64 бита для представления времени, поэтому он имеет допустимый диапазон практически для всего.

Чтобы исправить это, вы можете изучить использование DateTime , который не ограничен 32 битами.

person Matt Bryant    schedule 08.08.2013