Convert Time from one time zone to another in Rails

My created_at timestamps are stored in UTC:

>> Annotation.last.created_at
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00

How do I convert one of them to 'Eastern Time (US & Canada)' (taking into account daylight savings)? Something like:

Annotation.last.created_at.in_eastern_time

Solution 1:

Use the in_time_zone method of the DateTime class

Loading development environment (Rails 2.3.2)
>> now = DateTime.now.utc
=> Sun, 06 Sep 2009 22:27:45 +0000
>> now.in_time_zone('Eastern Time (US & Canada)')
=> Sun, 06 Sep 2009 18:27:45 EDT -04:00
>> quit

So for your particular example

Annotation.last.created_at.in_time_zone('Eastern Time (US & Canada)')

Solution 2:

Although this is an old question, it's worth mentioning something. In a previous reply it's suggested to use a before_filter to set the timezone temporally.

You should never, ever do that because Time.zone stores the information in the thread, and it will probably leak to the next request handled by that thread.

Instead you should use an around_filter to make sure that the Time.zone is reset after the request is complete. Something like:

around_filter :set_time_zone

private

def set_time_zone
  old_time_zone = Time.zone
  Time.zone = current_user.time_zone if logged_in?
  yield
ensure
  Time.zone = old_time_zone
end

Read more about this here

Solution 3:

If you add this to your /config/application.rb

config.time_zone = 'Eastern Time (US & Canada)'

Then you can cell

Annotation.last.created_at.in_time_zone

to get the time in the specified time zone.

Solution 4:

If you configure your /config/application.rb

config.time_zone = 'Eastern Time (US & Canada)'

Time.now.in_time_zone

DateTime.now.in_time_zone