たのしいRuby 第17章 時間関連クラス

Ruby漬けのGWも残り僅かで〜す。「この本の半分くらい終わればいいかなぁ」と、思っていたのですが、学習効率の高いirbのおかげで、案外順調に進んでます。

第三部最後の章。時間関連クラスに入ります。ワンライナ的な所なのでirbでいきたいと思います。

謎。

ふふ。早速謎の構文。

p Time.mktime(2006,5,15,05,13,11)
#=> Mon May 15 05:13:11 +0900 2006

よく見ると"05"となってます。確認します。

p 012345
#=> 5349

サンプルは8進数で書いてありますね・・・危険です。罠です。

では、"09"にするとどうなるか。

p Time.mktime(2006,5,15,09,13,11)
#=> SyntaxError: compile error

SyntaxErrorです。案外やってしまいそうなので、注意が必要かと思います。

8進数ついでに、もう一個確認しておきましょう。

p "012345".to_i
#=> 12345

文字からの変換は10進数になりますね。Linuxな世界では8進数を多用するので、罠に注意です。パーミッションの755も8進数です。

Time,DateTime,Date

Rubyでは3つの時間の表し方があるようです。

Time.now
#=> Sat May 05 17:21:28 +0900 2007
DateTime.now
#=> #<DateTime: 212045113299867697/86400000000,3/8,2299161>
Date.today
#=> #<Date: 4908451/2,0,2299161>
  • Time.now + 1は1秒足す
  • DateTime.now + 1は1日足す
  • Date.today + 1は1日足す

内部実装が違うので注意が必要です。

2038年問題

Timeは2038年までしか扱うことが出来ない。時間を32ビットで表しているため桁が溢れてしまう。詳しくはwikipediaを。

深刻です。コンピューター史上最悪の年となるでしょう・・・。

Rubyの場合、RangeErrorが発生しますね。

Time.now + 1_000_000_000
#=> RangeError: time + 1000000000.000000 out of Time range

時間の扱いも罠がいっぱいです。恐いっす。深刻っす。