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

sni*_*tko 14 timezone ruby-on-rails

我的页面上的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
Run Code Online (Sandbox Code Playgroud)

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

sni*_*tko 15

这是googled回答的工作:

min = cookies[:timezone].to_i
Time.zone = ActiveSupport::TimeZone[-min.minutes]
Run Code Online (Sandbox Code Playgroud)

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

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

  • @arkadiy是对的,但这不仅是一个小问题,因为你可以获得不遵守夏令时(DST)的时区.在这种情况下,结果是错误的时间.此外`new Date().getTimezoneOffset()`返回当前偏移量,包括DST,但`ActiveSupport :: TimeZone []`选择需要标准时区偏移,所以你应该更新你的javascript函数[像这样](http:// bit .ly/timezone_js).如果您想了解更多相关信息,可以查看[此主题](https://github.com/potomak/tomatoes/issues/8#issuecomment-2167461). (2认同)

efa*_*tsi 6

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

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

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

<script type="text/javascript">

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

</script>
Run Code Online (Sandbox Code Playgroud)

在application_controller.rb中,我有

before_filter :set_timezone 

private
def set_timezone
  Time.zone = cookies["time_zone"]
end
Run Code Online (Sandbox Code Playgroud)

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

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