Ruby on rails 是否在Rails中设置当前时区?

Ruby on rails 是否在Rails中设置当前时区?,ruby-on-rails,timezone,Ruby On Rails,Timezone,页面上的Javascript将客户端UTC偏移量保存到cookie。 如何使用此cookie创建时区并将其分配给Time.zone 我需要像这样的东西: before_filter :set_time_zone def set_time_zone Time.zone = ActiveSupport::TimeZone.new('my timezone', cookies[:timezone]) end 除了这个表达式的正确部分不起作用,我不确定我是否走对了。无法获取它。当我将它存储在我的

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

我需要像这样的东西:

before_filter :set_time_zone

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

除了这个表达式的正确部分不起作用,我不确定我是否走对了。无法获取它。

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

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中执行此操作,我认为将其存储在用户模型中更有意义。

以下是谷歌搜索的有效答案:

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

@斯尼特科-你的回答在很长一段时间里对我很有用。然而,正如@Giovanni所指出的,在某些情况下,它不考虑夏令时,因为它在给定分钟偏移量的情况下提取第一个可用时区。我找到了一个简单可行的答案来解释DST

头在这里-,这是一个javascript时区检测器。您只需将从网站(或右侧)链接的javascript代码复制到应用程序的一个javascript文件中(application.js工作正常)。它允许您通过名为
jstz
的对象检索时区

然后,在application.html.erb中

<script type="text/javascript">

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

</script>
这就是你所需要的!已为Rails应用程序正确设置时区


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

不,我不需要将其存储在用户模型中。无论如何,您当前的用户时区是什么样子的?它是字符串吗?是的,只是使用时区内置的Rails,所以对于我的应用程序用户来说,它通常只是“Sydney”,在Model(MVC的M部分)中访问session和cookie之类的对象不是一个好的实践,您在applicaton\u controller.rb中使用的设置\u时区方法与之前的\u过滤器相同,但这是为应用程序设置时区的错误方法,因为time.zone是全局对象,zone是全局属性。您需要使用如下内容的环绕过滤器:def set_time_zone old_time_zone=time.zone if current_user time.zone=current_administrator.time_zone end yield确保time.zone=old_time_zone end如果(!($.cookie('timezone'))您可能还需要删除该>>>)一个小问题是:
时区[-min.minutes]
返回第一个可用的时区,其偏移量为
min.minutes
。例如,对于东京,它返回伊尔库茨克。因此,如果您不需要显示时区名称或代码,此方法将起作用。@Arkady是对的,但这不仅仅是一个小问题,因为您可以获得不遵守夏令时(DST)的时区。在这种情况下,结果是错误的时间。此外,
new Date().getTimezoneOffset()
返回当前偏移量,包括DST,但是
ActiveSupport::TimeZone[]
选择需要标准时区偏移量,因此您应该更新javascript函数。如果你想了解更多,你可以了解这个问题。嘿,我知道这是一个很长的时间。。但是我在做这个。你能澄清最后一行吗?设置cookie后是否不必刷新页面以影响当前页面?最后一行将时区设置为应用程序的全局配置。如果有很多人从不同的时区访问您的应用程序,这可能不是最好的方法(与在单个用户上设置时区相比)。但是,是的,你是正确的,你需要刷新页面,以便服务器使用更新的时区呈现页面,以查看任何与时间相关的更改。嘿,我相信Time.Zone是线程安全的,只要你在每个请求上设置它,我想不应该干扰请求之间的关系,对吗?我实际上指的是你的编辑行,它说的是把饼干放在末尾?啊。是的,我不记得为什么我添加了编辑。这已经有很长一段时间了,但是我当时正在构建一个Rails应用程序,我相信我遇到了一个问题,代码没有运行,除非它在
标记之后。啊,好的,不用担心,它对我来说是有效的,在dev-atleastBe上警告说
time.zone=
将全局设置时区(不仅仅针对此请求);您应该坚持使用
时间。使用\u zone
并传递一个块,以确保该区域仅影响此请求。这非常适合rails在\u操作周围使用
,而不是在\u操作
之前使用
before_filter :set_timezone 

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