追記: Ruby 2.7 からは Time#floor メソッドが追加され、Time.now.floor のようにしてマイクロ秒を
切り捨てることができるようになりました
Ruby の Time インスタンスはマイクロ秒まで保持しているので、データベースや文字列から復元したときに == が false を返す場合がある。
# Rails で MySQL 使ってる場合
@now = Time.now
@article.published_at = @now
@article.save!
@article.published_at == @now # true
@article.reload
@article.published_at == @now # false
下記の 2 つのメソッドを使って、マイクロ秒を切り捨てることができる。
-
Time#to_i
UNIX エポックからの秒数を整数で返す -
Time.at
UNIX エポックからの秒数から Time インスタンスを作る
t = Time.at(Time.now.to_i)
t.usec # => 0
応用すれば、秒の切り捨てもできる。
t = Time.new(2013, 4, 4, 12, 34, 56) # => 2013-04-04 12:34:56 +0900
# 秒の切り捨て
SEC_PER_MIN = 60
Time.at(t.to_i / SEC_PER_MIN * SEC_PER_MIN) # => 2013-04-04 12:34:00 +0900
分・時の切り捨てはタイムゾーンが影響するのでこの方法ではうまくいかない。