2007/03/29

Time at

Ruby で

Time.at(1)
=>Thu Jan 01 09:00:01 +0900 1970

1を指定すると 1970年の1月1日になった。
じゃ最大値はいくつまで許されているのだろうかと、試してみた。

t = Time.now
def checkepoc(num, max)
  while num <= max
    begin
    Time.at(num)
    num += 60
    rescue
     return num
    end
  end
end

num = 2140000000 #Bignum
max = 2150000000
p res = checkepoc(num, max)
#=>2147483648
puts Time.at(res-1)
#=>Tue Jan 19 12:14:07 +0900 2038
p Time.at(res)
#=> RangeError: bignum too big to convert into ‘long’


error がきたらループから抜けてその時の数字を返し1 秒だけ引いて日付を表示。最後にその数値で本当にエラーなるかだめ押しで確認。

限界値は 2147483648 。Time.at で日付に直すと 2038-01-19 12:14:07(日本時間)。
とっても中途半端な日付時刻なのね。?

--telop
晴れ

--imported_from
http://www.midore.net/daybook/2007/03/1175168999.html

+++ 追記 +++

2010-02-06
およそ3年ぶりに上記を実行してみたところ...

nil
(...) undefined method `-' for nil:NilClass (NoMethodError)

になってしまった。

ruby 1.9.1p376, ruby 1.8.7 どちらでも同様の結果だった。

まさかのもしや?

% ruby -v -rtime -e "t = Time.local(2040,01); n = t.to_i; p Time.at(n)"
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
Sun Jan 01 00:00:00 +0900 2040

% ruby19 -v -rtime -e "t = Time.local(2040,01); n = t.to_i; p Time.at(n)"
ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-darwin10.2.0]
2040-01-01 00:00:00 +0900


びっくり!。いつのまにか 2038 年問題は消えておりました。とさ。
ここにおいては。

% uname -sv
Darwin Darwin Kernel Version 10.2.0: Tue Nov  3 10:37:10 PST 2009; root:xnu-1486.2.11~1/RELEASE_I386


ついでに

 18 p n = Time.local(2038, 1, 1).to_i
 19 # => 2145884400
 20 p n.class
 21 # => Fixnum
 22 
 23 p n2 = n + 60*60*24
 24 # => 2145970800
 25 p n2.class
 26 # => Fixnum
 27 
 28 p Time.local(2041, 01, 01)
 29 # => 2041-01-01 00:00:00 +0900

0 件のコメント: