在Rails中设置当前的Time.zone?

我的页面上的Javascript将客户端UTC偏移量保存到cookie。 如何使用此cookie创建TimeZone并将其分配给Time.zone?

我需要这样的东西:

before_filter :set_time_zone def set_time_zone Time.zone = ActiveSupport::TimeZone.new('my timezone', cookies[:timezone]) end 

除了这个表达式的右边部分不起作用,我不确定我是否在这里采取正确的方式。 无法得到它。

这是googled回答的工作:

 min = cookies[:timezone].to_i Time.zone = ActiveSupport::TimeZone[-min.minutes] 

只是为了说清楚,javascript部分:

 if(!($.cookie('timezone'))) { current_time = new Date(); $.cookie('timezone', current_time.getTimezoneOffset(), { path: '/', expires: 10 } ); } 

@snitko – 很长一段时间你的回答对我很有帮助。 然而,正如@Giovanni指出的那样,在某些情况下它没有考虑夏令时,因为它在给定分钟偏移的情况下拉出第一个时区。 我找到了一个简单的工作答案,说明了夏令时。

到这里 – http://site.pageloom.com/automatic-timezone-detection-with-javascript ,这是一个javascript时区检测器。 您只需将从网站链接的javascript代码(或此处 )复制到您的应用程序的javascript文件之一(application.js工作正常)。 它允许您通过名为jstz的对象检索时区。

然后,在application.html.erb中我有

  

在application_controller.rb中,我有

 before_filter :set_timezone private def set_timezone Time.zone = cookies["time_zone"] end 

这就是你所需要的! 为您的Rails应用程序正确设置了时区。

编辑:由于加载了javascript文件的方式和顺序不同,您可能需要在application.html.erb中的<\body>标记之后放置javascript cookie设置代码。

当我将它存储在我的用户模型中时,它就像这样简单

 def set_time_zone Time.zone = current_user.time_zone unless current_user.blank? end 

所以也许你可以做到

 def set_time_zone Time.zone = cookies[:timezone] end 

这是未经测试的,我从来没有试过从cookie中做到这一点,我认为将它存储在User模型中更有意义。