【发布时间】:2011-04-10 07:58:50
【问题描述】:
我的应用程序中有一个非常奇怪的夏令时 (DST) 问题。出于某种原因,每当我从表中收到时间时,它都不会针对 DST 进行自我调整。例如,如果我在控制台中创建一个新的时间,在适当的时区,将其写入数据库,然后尝试从数据库中检索它,它会提前一小时返回。
这是一个例子:
在这里,我们可以看到使用控制台,在美国东部标准时间 15:00 创建一个新时间等于世界标准时间 19:00(因为针对 DST 进行了调整,所以它是 -0400 而不是通常的 -0500):
ruby-1.8.6-p114 > Time.zone
=> #<ActiveSupport::TimeZone:0x12b1b68 @name="UTC", @tzinfo=nil, @utc_offset=0>
ruby-1.8.6-p114 > Time.zone = "Eastern Time (US & Canada)"
=> "Eastern Time (US & Canada)"
ruby-1.8.6-p114 > Time.zone.parse("15:00")
=> Thu, 09 Sep 2010 15:00:00 EDT -04:00
ruby-1.8.6-p114 > Time.zone.parse("15:00").utc
=> Thu Sep 09 19:00:00 UTC 2010
ruby-1.8.6-p114 > Time.zone.parse("15:00").dst?
=> true
现在,我尝试将同一时间写入数据库,然后将其取回:
ruby-1.8.6-p114 > b = Book.new
=> #<Book id: nil, return_time: nil, created_at: nil, updated_at: nil>
ruby-1.8.6-p114 > b.return_time = Time.zone.parse("15:00")
=> Thu, 09 Sep 2010 15:00:00 EDT -04:00
ruby-1.8.6-p114 > b.save
=> true
ruby-1.8.6-p114 > result = Book.find(:last).return_time
=> Sat Jan 01 19:00:00 UTC 2000
ruby-1.8.6-p114 > result.zone
=> "UTC"
ruby-1.8.6-p114 > result.in_time_zone
=> Sat, 01 Jan 2000 14:00:00 EST -05:00
ruby-1.8.6-p114 > result.dst?
=> false
我的 environment.rb 有这个:
config.time_zone = 'UTC'
而 application_controller.rb 有这个:
before_filter :set_user_time_zone
def set_user_time_zone
if current_user
Time.zone = current_user.time_zone
else
Rails.logger.error '[Time.zone.now.to_s][ERROR]: Missing current_user from in set_user_time_zone!'
end
结束
关于这里可能发生什么以及如何解决它的任何想法?我已经在这几天了,所以真的,任何帮助都将不胜感激!
非常感谢。
【问题讨论】:
标签: ruby-on-rails time timezone dst