「Ruby」Timeクラスの比較

Time#to_sしてみると同じ年月日時間分秒なのに、比較するとFalseを返してうーん?と思ったメモ。

RubyのTimeクラスは内部でUNIXTIMEを持ってると思ってたけど、最小単位が秒の整数型じゃなくて、浮動小数点みたい。つまり秒未満の値も持ってる(ms単位以下のタイマー精度がどれほどなのかは不明、環境依存してそう)。なので、Time.nowみたいなメソッドだと同じ時間は作れない。

irb(main):001:0> Time.now == Time.now
=> false
irb(main):002:0> Time.now > Time.now
=> false
irb(main):003:0> Time.now < Time.now
=> true
irb(main):004:0> Time.at(Time.now.to_i) == Time.at(Time.now.to_i)
=> true
irb(main):005:0> Time.now.to_f
=> 1239906600.3743
irb(main):006:0> Time.now.to_f
=> 1239906602.24573

小数点以下を消して整数型にして作成しなおすと、端数が消えてわかりやすく比較できるレベルになる。(当然↑のサンプルだとTime.nowと2回目のTime.nowが秒を跨ぐこともあるだろうけども)

そんな小ネタでした。