4

私は本当にこれにこだわっています。基本的に、Excelファイルをインポートしたい。そのため、Rails からの CSV インポートを使用することになりました。

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

実際には、インポートは正常に機能していますが、Excel/CSV ファイルには Date-Column があり、データベースには DateTime-Column があります。CSV.open-Method で次のことを行いました。

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 サーフェス (ブラウザ内) でイベントを作成すると、すべて正常に動作します (DB に UTC を保存するために 1 時間を減算し、正しいタイムゾーンで表示するために 1 時間を追加します)。

この問題をローカライズする方法のヒントがあれば、本当に役に立ちます。

私のシステム: Ruby 1.9.3p194 上の Rails 3.2.3、Suse Enterprise 上の MySQL

例:

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

データベース (MySQL):

| 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_start 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
4

1 に答える 1

4

あなたが見ている違いは、夏時間 (DST) によるものだと確信しています。

夏季の日付はすべて +0200 ですが、その他の日付はすべて +0100 であることに注意してください。それはあなたが気付かなかった接続です。

これは、ベルリンが DST のタイムゾーンであるためです。インポートしている日付はすべて UTC であり、DB には UTC として書き込まれますが、Rails は (正しく) 夏かどうかによって異なる解釈をします。

一定の 1 時間の差が得られないのはそのためです。

夏でも冬でも、現地時間の 9:30 にしたい場合は、

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

インポートコードで。

詳細については、 ActiveSupport::TimeWithZoneを参照してください。

于 2013-03-15T16:05:03.873 に答える