带rails 3的时区

Posted

技术标签:

【中文标题】带rails 3的时区【英文标题】:Timezone with rails 3 【发布时间】:2011-05-20 17:53:09 【问题描述】:

我有一个很常见的问题,但出于某种原因,我尝试了网络上的所有建议,但似乎没有一个有效。

我已将配置中的时区设置为“EST”

config.time_zone = 'Eastern Time (US & Canada)'

但是当屏幕上显示时间时,它会继续显示存储在数据库中的 UTC 时间。我尝试了调试器,这是输出

(rdb:1) Time.zone 
#<ActiveSupport::TimeZone:0x1061f4760 @utc_offset=nil, @current_period=nil, @name="Eastern Time (US & Canada)", @tzinfo=#<TZInfo::TimezoneProxy: America/New_York>>
(rdb:1) Order.first.placed_at
Fri Jan 01 15:00:00 UTC 2010

更新: 这是另一个有同样问题的用户 Rails timezone is wrong when shown

【问题讨论】:

有关时区的更多信息:api.rubyonrails.org/classes/ActiveSupport/TimeZone.html 【参考方案1】:

试试in_time_zone。例如

>> Time.now
=> Sun Dec 05 21:34:45 -0500 2010
>> Time.zone
=> #<ActiveSupport::TimeZone:0x1033d97b8 @name="Pacific Time (US & Canada)", @tzinfo=#<TZInfo::DataTimezone: America/Los_Angeles>, @utc_offset=-28800, @current_period=nil>
>> Time.now.in_time_zone
=> Sun, 05 Dec 2010 18:34:54 PST -08:00

在你的情况下,你想要Order.first.placed_at.in_time_zone

【讨论】:

但我认为在配置中设置时区会自动指示 activerecord 在本地时区检索.. ryandaigle.com/articles/2008/1/25/… 根据我的经验,我必须明确告诉视图使用本地时区(而不是 UTC)。也许存在更好的方法。 这让我发疯了。万分感谢! :-) 否定的。调用它的正确方法是 Time.current。我遇到了同样的问题,使用 #current 而不是 #now 来获取给定时区的时间。【参考方案2】:

检查您的ActiveRecord::Base.time_zone_aware_attributes 是否为真。

【讨论】:

【参考方案3】:

我认为您所描述的是这个错误 - https://github.com/rails/rails/issues/6816

【讨论】:

【参考方案4】:

如果您想为应用的不同用户设置不同的时区,请确保使用 around_filter 而不是 before 过滤器来更改 Time.zone。与 Time.zone 如何泄漏到其他线程有关,因此其他用户可能会继承他们不应该的时区。来自这篇博文:http://ilikestuffblog.com/2011/02/03/how-to-set-a-time-zone-for-each-request-in-rails/

在 application_controller.rb 中:

around_filter :set_time_zone

private

def set_time_zone
  old_time_zone = Time.zone
  Time.zone = current_user.time_zone if logged_in?
  yield
ensure
  Time.zone = old_time_zone
end

我还发现在允许用户更改时区时,使用 time_zone_select 表单辅助方法很有帮助。如果你调用你的字段:time_zone,你会像这样使用它:

f.time_zone_select(:time_zone)

最后,这看起来非常棒。 通过 javascript 自动检测和设置时区。这是要添加到资产管道的 rails gem:https://github.com/scottwater/detect_timezone_rails 和随附的博客文章:http://www.scottw.com/automated-timezone-detection

【讨论】:

完美答案,如果你问我!!

以上是关于带rails 3的时区的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3:如何在特定时区获取今天的日期?

在 Rails 和 PostgreSQL 中完全忽略时区

Rails 3.0.20 应用程序上的 Ruby 升级(从 1.8.7 开始)导致时区异常

在转换为UTC 0时区之前,Rails在哪里获得时区?

Rails:使用Heroku时如何获取当前用户的时区

Rails:如何将日期时间字符串解析为特定时区