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 out of Time range (RangeError) from ruby​​_time.rb:11

2038 年問題に遭遇していますか? 64 ビットの Ruby 1.9.2-p290 ではこの問題は発生しません。

4

1 に答える 1

6

32 ビット Ruby は時間を表すために 32 ビットを使用します。したがって、有効な範囲は から です13 Dec 1901 20:45:54 UTC19 Jan 2038 03:14:07 UTCこれらは 32 ビットで表現可能な最小/最大の符号付き整数値であり、時間 0 は UNIX エポック時間 ( 1 Jan 1970 00:00:00 UTC) です。

64 ビット Ruby は 64 ビットを使用して時刻を表すため、基本的に有効な範囲は何でもあります。

DateTimeこれを修正するには、32 ビットに限定されないクラスの使用を調べることができます。

于 2013-08-08T03:49:54.290 に答える