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 <[email protected]> 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')
>> => #<Post id: 7835, created_at: "2010-04-20 05:46:03", updated_at:
>> "2010-04-20 05:46:03">
>>>> Post.find(:first, :order => 'created_at DESC')
>> => #<Post id: 7866, created_at: "2010-04-20 17:17:26", updated_at:
>> "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 [email protected].
>> To unsubscribe from this group, send email to
>> [email protected].
>> 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 [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/heroku?hl=en.