Re: Using Time.now in AR#find :conditions - not working correctly?
I really like the way this was written up in DelayJob / job.rb def self.db_time_now if Time.zone Time.zone.now elsif ActiveRecord::Base.default_timezone == :utc Time.now.utc else Time.now end end FWIW/ --Keenan On Apr 20, 2010, at 2:01 PM, Matthew A. Brown wrote: > The usual approach with ActiveRecord is to treat datetime columns as > time-zone-less -- in other words, regardless of whether postgres has > an internal idea of time zone, you interpret the values of those > columns in whatever time zone makes sense. > > To make that less of a pain, many applications set ActiveRecord to > persist all timestamps as UTC -- this is just a configuration setting > you can put into your environment.rb: > >ActiveRecord::Base.default_timezone = :utc > > Then, whenever you're doing time-based queries, you need to remember > to cast the time in question to UTC. One could make the argument that > ActiveRecord should do this for you, or that it shouldn't, but either > way it doesn't, so it's just something you have to remember to do in > your code. > > Naturally, operations that assume that your idea of a time zone and > the database's are the same -- such as performing a query with NOW() > -- are going to cause you problems; but since you're probably building > all your queries in Ruby anyway, it's easy enough to avoid those > situations. > > Mat > > On Tue, Apr 20, 2010 at 13:39, Matthew Moore wrote: >> I have a model that I'm trying to do a find along with conditions that >> rely on Time.now. >> >> When I run 2 simple queries, one with created_at <= Time.now, and one >> without, I expect to find the exact same record (because no new posts >> have been created in between these calls). >> >> But I get different results -- >> >> Here's my output: Time.now >> => Tue Apr 20 10:38:01 -0700 2010 Time.now.utc # For verification purposes >> => Tue Apr 20 17:38:05 UTC 2010 Post.find(:first, :conditions => ['created_at <= ?', Time.now], :order => 'created_at DESC') >> => #> "2010-04-20 05:46:03"> Post.find(:first, :order => 'created_at DESC') >> => #> "2010-04-20 17:17:26"> >> >> >> Is this because the Timezone of the server is set wrong? Something >> funky with Postgres? >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Heroku" group. >> To post to this group, send email to her...@googlegroups.com. >> To unsubscribe from this group, send email to >> heroku+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/heroku?hl=en. >> >> > > -- > You received this message because you are subscribed to the Google Groups > "Heroku" group. > To post to this group, send email to her...@googlegroups.com. > To unsubscribe from this group, send email to > heroku+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/heroku?hl=en. > -- You received this message because you are subscribed to the Google Groups "Heroku" group. To post to this group, send email to her...@googlegroups.com. To unsubscribe from this group, send email to heroku+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/heroku?hl=en.
Re: Using Time.now in AR#find :conditions - not working correctly?
The usual approach with ActiveRecord is to treat datetime columns as time-zone-less -- in other words, regardless of whether postgres has an internal idea of time zone, you interpret the values of those columns in whatever time zone makes sense. To make that less of a pain, many applications set ActiveRecord to persist all timestamps as UTC -- this is just a configuration setting you can put into your environment.rb: ActiveRecord::Base.default_timezone = :utc Then, whenever you're doing time-based queries, you need to remember to cast the time in question to UTC. One could make the argument that ActiveRecord should do this for you, or that it shouldn't, but either way it doesn't, so it's just something you have to remember to do in your code. Naturally, operations that assume that your idea of a time zone and the database's are the same -- such as performing a query with NOW() -- are going to cause you problems; but since you're probably building all your queries in Ruby anyway, it's easy enough to avoid those situations. Mat On Tue, Apr 20, 2010 at 13:39, Matthew Moore wrote: > I have a model that I'm trying to do a find along with conditions that > rely on Time.now. > > When I run 2 simple queries, one with created_at <= Time.now, and one > without, I expect to find the exact same record (because no new posts > have been created in between these calls). > > But I get different results -- > > Here's my output: >>> Time.now > => Tue Apr 20 10:38:01 -0700 2010 >>> Time.now.utc # For verification purposes > => Tue Apr 20 17:38:05 UTC 2010 >>> Post.find(:first, :conditions => ['created_at <= ?', Time.now], :order => >>> 'created_at DESC') > => # "2010-04-20 05:46:03"> >>> Post.find(:first, :order => 'created_at DESC') > => # "2010-04-20 17:17:26"> > > > Is this because the Timezone of the server is set wrong? Something > funky with Postgres? > > -- > You received this message because you are subscribed to the Google Groups > "Heroku" group. > To post to this group, send email to her...@googlegroups.com. > To unsubscribe from this group, send email to > heroku+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/heroku?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Heroku" group. To post to this group, send email to her...@googlegroups.com. To unsubscribe from this group, send email to heroku+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/heroku?hl=en.
Using Time.now in AR#find :conditions - not working correctly?
I have a model that I'm trying to do a find along with conditions that rely on Time.now. When I run 2 simple queries, one with created_at <= Time.now, and one without, I expect to find the exact same record (because no new posts have been created in between these calls). But I get different results -- Here's my output: >> Time.now => Tue Apr 20 10:38:01 -0700 2010 >> Time.now.utc # For verification purposes => Tue Apr 20 17:38:05 UTC 2010 >> Post.find(:first, :conditions => ['created_at <= ?', Time.now], :order => >> 'created_at DESC') => # >> Post.find(:first, :order => 'created_at DESC') => # Is this because the Timezone of the server is set wrong? Something funky with Postgres? -- You received this message because you are subscribed to the Google Groups "Heroku" group. To post to this group, send email to her...@googlegroups.com. To unsubscribe from this group, send email to heroku+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/heroku?hl=en.