32位的 Ruby 1.9.2p290 版本无法处理2038年的时间问题?

3

使用必须为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 = Fixnum

more_time.class = Fixnum

ruby_time.rb:11:in `+': time + 788400000.000000 超出了时间范围 (RangeError) from ruby_time.rb:11

我是否遇到了2038年问题?但是在64位的ruby 1.9.2-p290中没有这个问题。

1个回答

6

32位 Ruby 使用32位来表示时间,因此其有效范围为 1901年12月13日20:45:54 UTC2038年1月19日03:14:07 UTC,这是32位有符号整数可表示的最小/最大值,其中时间0是 Unix 纪元时间 (1970年1月1日00:00:00 UTC)。

64位 Ruby 使用64位来表示时间,因此其有效范围基本上没有限制。

要解决这个问题,您可以考虑使用 DateTime 类,它不受32位限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接