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