Time Zones

Geplaatst door Michiel de Mare do, 28 mei 2009 21:28:00 GMT

Tijdfuncties in Rails zijn op sommige punten nogal wankel. Zo zou je verwachten dat Time.now en 0.seconds.ago gelijk zijn. Dat is niet zo:

>> Time.now
=> Thu May 28 23:28:37 +0200 2009
>> 0.seconds.ago
=> Thu, 28 May 2009 23:28:42 CEST +02:00

Nadere inspectie leert dat Time.now een normaal Ruby Time instantie is, terwijl 0.seconds.ago een ActiveSupport::TimeWithZone object is.

En dat kan een flink verschil maken! Bij deze code bijvoorbeeld:
>> Time.now.to_s(:db)
=> "2009-05-28 23:33:08" 
>> 0.seconds.ago.to_s(:db)
=> "2009-05-28 21:33:16" 

De to_s(:db) method wordt gebruikt in find queries en named scopes, en bovenstaand verschil maakt dat het gebruik van Time.now, Time.parse en Time.at af te raden is wanneer het als database-parameter gebruikt kan worden. Rails converteert Time instanties wel in TimeWithZone objecten bij ActiveRecord-attributen. Als alternatief kan Time.zone.now etc. gebruikt worden.

Kortom: u.published_at = Time.now werkt prima, maar wanneer je in je environment.rb een lokale tijdzone hebt staan, gaat dit verkeerd in Rails 2.3.2:
named_scope :begun, proc{{:conditions => ['started_at < ?', Time.now]}}

Weest op uw hoede!

Recommend Michiel de Mare

Tags ,  | 5 reacties