2013-03-15 71 views
3

我真的很擔心這個。 基本上我想導入一個Excel文件。所以我最終使用了Rails的CSV導入。Ruby on Rails中的錯誤TimeZone轉換

CSV.open('[path-to-file]', 'r').each do |row| 

實際上導入工作正常,但除其他事物的日期,列在Excel中/的CSV文件,並在數據庫中的日期時間,列。我確實遵循了CSV.open方法:

date = DateTime.strptime(row[0], "%Y-%m-%d").strftime("%Y-%m-%d") 
start_datetime = DateTime.parse(date + " 6:30:00").utc 
Event.create(:event_start => start_datetime) 

這會在數據庫中創建正確的DateTime正確的事件。看起來例如像:

2008-11-18 09:30:00 

我的問題:

如果我選擇註釋行的application.rb中

config.time_zone = 'Berlin' 

Rails使用UTC來顯示我的活動,一切看起來就像數據庫的內容一樣。

如果我選擇取消對config.time_zone部分(我一定得),Rails的應該加上1小時(柏林:UTC/GMT +1小時)。實際上它至少增加1小時,但有時增加2小時。沒有連接(對我來說),在這種情況下,Rails選擇添加1或2個小時。

如果我在正常Web表面上(在瀏覽器中)創建一個事件,一切工作正常(在1小時內減去在數據庫中保存UTC並加1小時以顯示在正確的時區中)。

這將是非常有益的,如果你對我有一些提示,我怎麼可以嘗試本地化這個問題。

CSV:

2012-01-08 
2012-02-09 
2012-03-10 
2012-04-11 
2012-05-12 
2012-06-13 
2012-07-14 
2012-08-15 
2012-09-16 
2012-10-17 
2012-11-18 
2012-12-19 

DB(MySQL的):

我的系統:關於Ruby 1.9.3p194,MySQL在SUSE企業

例的Rails 3.2.3

| id | event_start +----+--------------------- | 1 | 2012-01-08 06:30:00 | 2 | 2012-02-09 06:30:00 | 3 | 2012-03-10 06:30:00 | 4 | 2012-04-11 06:30:00 | 5 | 2012-05-12 06:30:00 | 6 | 2012-06-13 06:30:00 | 7 | 2012-07-14 06:30:00 | 8 | 2012-08-15 06:30:00 | 9 | 2012-09-16 06:30:00 | 10 | 2012-10-17 06:30:00 | 11 | 2012-11-18 06:30:00 | 12 | 2012-12-19 06:30:00 

視圖(瀏覽器) - 在這裏,我只是用一個.order(「event_star t ASC「)

events.each do |ev| 
ev.event_start 

2012-12-19 07:30:00 +0100 
2012-11-18 07:30:00 +0100 
2012-10-17 08:30:00 +0200 
2012-09-16 08:30:00 +0200 
2012-08-15 08:30:00 +0200 
2012-07-14 08:30:00 +0200 
2012-06-13 08:30:00 +0200 
2012-05-12 08:30:00 +0200 
2012-14-11 08:30:00 +0200 
2012-03-10 07:30:00 +0100 
2012-02-09 07:30:00 +0100 
2012-01-08 07:30:00 +0100 
+0

從瀏覽器中注意以下兩個日期:2012-07-14和2012-14-11。第一個在最後一個字段中顯示14(建議這是日期欄)。然而後一個日期在第二列中顯示14(表明這是日欄)。這當然是矛盾的。 – 2013-03-15 16:12:09

+0

我也注意到了。我想這是一個錯字,應該是04-11(從記錄的順序來判斷)。 – awendt 2013-03-15 16:25:08

回答

3

我很確定你看到的差異是因爲夏令時(DST)。

注意,夏季期間的所有日期+0200,而所有其他都是+0100。這是你沒有注意到的聯繫。

這是因爲柏林是DST時區。您導入的日期都是UTC,它們會以UTC格式寫入數據庫,但Rails(正確)以不同的方式解釋它們,具體取決於它們是否在夏季。

這就是爲什麼你沒有得到恆定的1個小時的時差。

如果你希望時間是9:30本地時間,無論在夏季或冬季,嘗試在您導入代碼使用

Time.zone.parse("#{date} 09:30:00") 

。詳情請參閱ActiveSupport::TimeWithZone

+1

這太好了。謝謝你的回答。那是我想過的最後一次。保存了我的一天:) – michi 2013-03-15 16:13:36

+0

我已經用可能的解決方案更新了我的答案... – awendt 2013-03-15 16:18:42

+0

太棒了。真棒!非常感謝。 – michi 2013-03-15 16:25:13