Improved timezones in Rails 2.1

Posted by glenn on Friday, February 08, 2008

Posted in ruby on rails, time zones

handling-time-zones-in-rails

The latest release of rails has made the handling of timezones in rails even easier. No longer do you need to install a couple of plugins, although you still need the tzinfo gem.

With the new baked in support for timezones in rails you can ignore the previous article on how to support timezones in rails 1.2.x. Now all you need to do is set the desired timezone you want to be working in:

Time.zone = "Pacific Time (US & Canada)"

Behind the scenes the date will be saved as UTC, but the appropriate timezone conversion will happen for you whenever you output a date or datetime.

> Time.zone = "Pacific Time (US & Canada)" 
> @post = Post.find :first
> @post.created_at
=> Fri, 08 Feb 2008 09:00:00 PST -08:00
> @post.created_at = Time.utc 2008, 1, 1
> @post.created_at
=> Mon, 31 Dec 2007 16:00:00 PST -08:00

It also makes it a breeze to display timezones that are customised to your end-users locality with a before filter:

class ApplicationsController < ApplicationController
  before_filter :set_timezone

  private
    def set_timezone
      Time.zone = current_user.time_zone || "Pacific Time (US & Canada)" 
    end
end

Alternatively you can specify a default timezone in your environment.rb:

Rails::Initializer.run do |config|
  config.time_zone = "Pacific Time (US & Canada)" 
end

Oh and of course Time.now will still return the time according to the server, if you want the current time in the user’s local timezone then:

Time.zone.now
Glenn Gillen is a ruby, merb, and ruby on rails developer with clients in London, New York, Los Angeles, and Australia. Contact Ruby Pond if you wish to discuss hiring Glenn or one of our other developers for your own project.
blog comments powered by Disqus