【问题标题】:Daylight Savings Time not calculated properly in Rails 2.3.5?在 Rails 2.3.5 中没有正确计算夏令时?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 这里有同样的问题,但我不能切换到 datetime 因为我只对时间感兴趣,我希望能够查询所有具有时间的记录,例如 13:00 .如果我切换到日期时间,我就不能这样做了。
    【解决方案2】:

    我不确定您使用的是什么版本的 Rails,但我在 2.1.2 中遇到了同样的问题。似乎包含的时区库半年都无法使用,但开发人员认为不值得切换;希望他们现在已经重新考虑了这个决定。

    无论如何,我们最终使用了 tzinfo_timezone 插件,它可以在夏令时正确计算 UTC 偏移量。

    【讨论】:

    • 非常感谢您的提示。我查看了一些 Rails 代码,试图弄清楚发生了什么,看起来 v2.3.5(我正在使用的版本)已经在使用 tzinfo。问题原来是菲尔所说的:当时间值被保存到表中时,日期变为 2000 年 1 月 1 日,这不在 DST 中......啊!不过现在已经修好了,谢谢!
    猜你喜欢
    • 2013-12-09
    • 2018-05-10
    • 2016-09-19
    • 2013-11-24
    • 2016-08-02
    • 2018-06-15
    • 2012-08-16
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多