2010-09-09 44 views
2

在我的應用程序中,夏令時(DST)有一個非常奇怪的問題。出於某種原因,每當我從表格中收到時間時,它都不會爲DST自行調整。例如,如果我在控制檯中創建一個新的時間,在適當的時區,將其寫入數據庫,然後嘗試從數據庫中檢索它,它會在一小時前回來。在Rails 2.3.5中夏時制時間計算不正確?

下面是一個例子:

在這裏,我們可以看到,使用控制檯,在美國東部時間下午3點創建一個新的時間等於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 

任何想法,什麼可能會發生在這裏,如何解決?我已經在這幾天了,真的,任何幫助將不勝感激!

非常感謝。

回答

5

它看起來像只保存時間部分;注意日期部分從Thu, 09 Sep 2010Sat, 01 Jan 2000。由於DST計算取決於日期,因此這可能是您丟失信息的地方。 (1月1日不在夏令時,所以假設該日期,夏令時計算是正確的)。您可能需要在數據庫中保存DATETIME,而不僅僅是TIME。

+0

你是絕對正確的菲爾,非常感謝你! :) – michaeldwp 2010-09-10 21:28:16

+1

同樣的問題在這裏,但我不能切換到日期時間,因爲我只對時間感興趣,我希望能夠查詢所有有時間後的記錄,例如13:00。如果我切換到日期時間,我不能這樣做。 – iwiznia 2011-06-09 15:09:20

1

我不確定您使用的Rails版本是什麼,但我在2.1.2中遇到同樣的問題。似乎包含的時區庫僅在半年內不工作,但開發人員並不認爲這是值得轉換的;希望他們現在已經重新考慮了這個決定。

無論如何,我們最終使用了tzinfo_timezone插件,它在夏令時期間正確計算UTC偏移量。

+0

非常感謝您的提示。我研究了一些Rails代碼來試圖弄清楚發生了什麼,它看起來像v2.3.5(我正在使用的版本)已經使用tzinfo。問題原來是菲爾所說的:當時間值被保存到表格中時,日期變爲2000年1月1日,這不在DST中...... argh!現在它已經修復了,謝謝! – michaeldwp 2010-09-10 21:28:00