2013-02-25 96 views
0

我在巴西,距離UTC有-3個小時。 我沒有做對Rails的時區的任何配置,我的控制檯行爲怪異,這裏是例子:Rails中奇怪的ActiveRecord時區行爲

1.9.3p194 :099 > FreeTime.first.starts_at 
    => 2000-01-01 11:15:26 UTC 
    1.9.3p194 :100 > FreeTime.first.starts_at.localtime 
    => 2000-01-01 09:15:26 -0200 
    1.9.3p194 :101 > FreeTime.first.starts_at.localtime.zone 
    => "BRST" 
    1.9.3p194 :102 > Time.now 
    => 2013-02-25 10:24:51 -0300 
    1.9.3p194 :103 > Time.now.zone 
    => "BRT" 
    1.9.3p194 :104 > Time.zone 
    => (GMT+00:00) UTC 

正如你所看到的,問題是Rails的時間類計算出正確的我localzone(從我的系統時鐘),但ActiveRecord不知何故錯誤。我想知道爲什麼ActiveRecord錯誤地認爲我的時區是BRST(正確的是BRT),即使我沒有做任何配置。

回答

2

它沒有得到任何錯誤。它意識到你在巴西時區,而在2000-01-01 11:15:26 UTC,巴西時區是在BRST,即UTC-2。

the year 2000,BRST - > BRT過渡是在2月26日。

您需要了解您的時區不是真正的「BRT」或「BRST」 - 它們是兩者的組合,包括它們之間的轉換。例如,我在英國。我們目前在格林威治標準時間,我們將在夏季過渡到BST - 因此夏季時間值的正確輸出爲BST,UTC + 1。

+0

很好的回答!我開始意識到在數據庫上擁有一個Time字段的最佳方法是使用Integer for Hour和Integer for Minutes。由於我在巴西,每次存儲時間時,都會在2000-01-01,因此出現在錯誤的時區。 – alexandrecosta 2013-02-25 14:36:48

+0

@ user1261084:說實話,這很少是開始時間的最佳方式。在大多數情況下,將值存儲爲UTC是寫入方法 - 最好存在將本地日期/時間與時區一起存儲的情況。 – 2013-02-25 14:40:13

+0

如果我每個星期二在15:00預約,夏季它將繼續在15:00。但是,如果我將它作爲「15:00:00 -0300」存儲在數據庫中,夏季時它會讓我知道約會是在「16:00:00 -0200」。非常混亂......時間是時間,因爲很多情況下它不依賴於區域。 DateTime依賴區域。我不明白爲什麼Rails堅持在Time數據庫屬性中記錄日期。它應該有一個更好的方法來避免這種混淆。現在我將時間存儲爲「11:00:00 -0300」,並且讓我回到「11:00:00 -0200」:https://gist.github.com/anonymous/5030404 – alexandrecosta 2013-02-25 15:06:54