Timeオブジェクトの等価でちょいはまった

Railsのテストでこんなメッセージが出た

expected but
was
.


あれ?なんでテスト落ちるんだろう。

irbで確認

irb(main):002:0> a = b = Time.now
=> Sat Mar 29 20:07:31 +0900 2008
irb(main):003:0> a == b
=> true

これは当たり前だ。同じオブジェクト指してるわけだし。

irb(main):004:0> a = Time.now
=> Sat Mar 29 20:08:18 +0900 2008
irb(main):005:0> b = Time.parse(a.to_s)
=> Sat Mar 29 20:08:18 +0900 2008
irb(main):006:0> a == b
=> false

げ。なんでfalse。

原因

簡単なことだった。

irb(main):004:0> a = Time.now
=> Sat Mar 29 20:08:18 +0900 2008
irb(main):005:0> b = Time.parse(a.to_s)
=> Sat Mar 29 20:08:18 +0900 2008
irb(main):006:0> a == b
=> false
irb(main):007:0> a - b
=> 0.859
irb(main):008:0> a.usec
=> 859000
irb(main):009:0> b.usec
=> 0


Time.nowには浮動小数点が含まれている。Time.parseとかlocalでやると、浮動小数点は0なんだ。


あ、今のは嘘だ。ごめんなさい(ノд`)Time.localはusecは指定できる。parseは無理のようです。

Time.local(year[, mon[, day[, hour[, min[, sec[, usec]]]]]])


まぁ、Timeの値は浮動小数点が考慮されていることを忘れないようしよう。