14

I'd like to let users of my app specify a time zone, and then set their time zone at the beginning of each request. In Rails, AFAICT, this is done by setting the singleton object:

Time.zone = "America/Los_Angeles"

My understanding of best practices is that, generally speaking, a singleton should be set ONCE. For example in the application configuration.

From an answer to a similar question, someone suggests setting it in the ApplicationController

class ApplicationController < ActionController::Base
  before_filter :set_timezone
  def set_timezone
    # current_user.time_zone #=> 'London'
    Time.zone = current_user.time_zone if current_user && current_user.time_zone
  end
end

Is this safe? Or do I run a risk of having one thread affect another? I will try running a test of this but it's not the easiest test scenario ever so I thought I should see if someone has already done this.

Duncan Jones
  • 63,838
  • 26
  • 184
  • 242
Tyler Gannon
  • 794
  • 3
  • 19

1 Answers1

21

If you look at the code where this is implemented you can see that the current zone is stored in a thread local variable, so each thread can set Time.zone without interfering with other threads.

Frederick Cheung
  • 81,462
  • 7
  • 146
  • 167