在Rails應用程序,我有如下形式的型號代碼:在ruby中比較相同的DateTime對象 - 爲什麼這兩個DateTime.now不相等?
def do_stuff(resource)
models = Model.where(resource: resource)
operated_at = DateTime.now
models.each { |model| some_operation(model, operated_at) }
some_other_operation models, operated_at
end
def some_operation(model, operated_at)
model.date_time_field = operated_at
model.save
end
def some_other_operation(models, operated_at)
models.each do |model|
if model.date_time_field < operated_at
# do something
end
end
end
some_other_operation的「有所作爲」塊就一定會執行,在這種情況下。更奇怪的是,如果我在控制檯中設置了沒有所有已定義函數的情況,則比較將按預期工作。例如:
> model = Model.first
> time_var = DateTime.now
> model.last_imported_at = time_var
=> Fri, 25 Oct 2013 21:14:06 +0000
> model.save
=> true
> model.last_imported_at < time_var
=> false
> model.last_imported_at == time_var
=> true
最後,如果在some_other_operation
我不是以下列方式比較:
if model.date_time_field.to_i < operated_at.to_i
# do something
end
只是預期,當到達「做一些事情」塊。我懷疑這是因爲to_i
方法會放棄在DateTime對象上定義的小數部分,而operated_at
變量實際上被重新定義爲DateTime.now
用於每個方法的範圍。如果是這樣的話,那麼我想我的問題是我如何強制operated_at
不爲每個範圍重新定義?
這可能是因爲保存的行爲該模型會導致DateTime的'seconds_fraction'部分被截斷。 (雖然我還沒有證實)。 – struthersneil
對不起,rails新手,我面對這類問題,只是想知道'localtime'或'timezone'對這種情況有影響嗎? – ksugiarto