夏令时在Rails 2.3.5中没有正确计算?
夏令时(DST)在我的应用程序中遇到了一个非常奇怪的问题。 出于某种原因,每当我从表格中收到时间时,它都不会为DST自行调整。 例如,如果我在控制台中创建一个新的时间,在适当的时区,将其写入数据库,然后尝试从数据库中检索它,它会在一小时前回来。
这是一个例子:
在这里,我们可以看到,使用控制台,在美国东部时间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
结束
任何有关可能发生的情况以及如何解决它的想法? 我已经在这几天了,真的,任何帮助将不胜感激!
非常感谢你。
看起来你只是在节省时间部分; 注意日期部分是从Thu, 09 Sep 2010
到Sat, 01 Jan 2000
Thu, 09 Sep 2010
Sat, 01 Jan 2000
。 由于DST计算取决于日期,因此这可能是您丢失信息的地方。 (1月1日不在夏令时,所以假设该日期,夏令时计算是正确的)。 您可能需要在数据库中保存DATETIME,而不仅仅是TIME。
我不确定你使用的Rails版本是什么,但是我在2.1.2中遇到了同样的问题。 似乎包含的时区库仅在半年内不工作,但开发人员并不认为这是值得转换的; 希望他们现在已经重新考虑了这个决定。
无论如何,我们最终使用了tzinfo_timezone插件,它在夏令时期间正确计算UTC偏移量。
链接地址: http://www.djcxy.com/p/29389.html上一篇: Daylight Savings Time not calculated properly in Rails 2.3.5?
下一篇: How to use TimeZoneInfo to get local time during Daylight Savings Time?