首页 文章

夏令时在Rails 2.3.5中无法正确计算?

提问于
浏览
2

我的应用程序中的夏令时(DST)有一个非常奇怪的问题 . 出于某种原因,每当我从表中收到时间时,它都不会为DST调整自己 . 例如,如果我在控制台中创建一个新的Time,在适当的时区,将其写入数据库,然后尝试从数据库中检索它,它会在一小时前返回 .

这是一个例子:

在这里,我们可以看到使用控制台,在美国东部时间15:00创建一个新的时间等于19:00 UTC(因为调整为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

结束

关于这里可能发生什么以及如何解决它的任何想法?我已经在这几天了,所以真的,任何帮助都将非常感谢!

非常感谢你 .

2 回答

  • 1

    看起来你只是节省了时间部分;注意日期部分如何从 Thu, 09 Sep 2010Sat, 01 Jan 2000 . 由于DST计算取决于日期,这可能是您丢失信息的地方 . (1月1日不在夏令时,所以假定该日期,DST计算是正确的) . 您可能需要在数据库中保存DATETIME,而不仅仅是TIME .

  • 5

    我不确定你使用的是什么版本的Rails,但我在2.1.2中遇到了同样的问题 . 似乎包括的时区图书馆半年没有工作,但开发人员认为不值得转换;希望他们现在重新思考这个决定 .

    无论如何,我们最终使用tzinfo_timezone插件,它在夏令时期间正确计算UTC偏移量 .

相关问题