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

时间:2009-06-03 01:59:13

标签: ruby-on-rails timezone

我页面上的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

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

3 个答案:

答案 0 :(得分:15)

这是谷歌的回答:

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 } );
} 

答案 1 :(得分:6)

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

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

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

<script type="text/javascript">

  var timezone = jstz.determine();
  document.cookie = 'time_zone='+timezone.name()+';';

</script>

在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设置代码。

答案 2 :(得分:3)

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

一样简单
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,我认为将它存储在用户模型中会更有意义。