2011-03-05 10 views
0

私はAppointmentモデルを持っています。特定の予定では、start_timeの12:15 amのデータを保存しました。これを見てください:Railsでの日付の保存とクエリに関する問題

irb(main):002:0> a = Appointment.find(15) 
=> #<Appointment id: 15, start_time: "2011-03-05 05:15:00", created_at: "2011-03-05 03:42:03", updated_at: "2011-03-05 03:42:03", stylist_id: 13, client_id: 8> 
irb(main):003:0> a.start_time 
=> Sat, 05 Mar 2011 00:15:00 EST -05:00 

ご覧のとおり、日付が間違って保存されました。面白いことに、Railsはデータが戻ってきたときにそれを補う。

私のアプリは常にこのように動作しており、気づかなかったと思います。しかし、最近では、SQLを使って日付を取り出すクエリが書かれているので、間違った時刻になってしまい、問題が発生しています。

誰もが、なぜこれが起こっているのか、問題を回避するために何ができるのかを明らかにすることはできますか?

答えて

0

レールはUTC時間(ゼロオフセット)でdatetimeをデータベースに保存し、それを表示するときに意図した時間帯に変換します。したがって、データベースから直接解析すると、UTC時間が得られます。

time_string = #raw string obtained from database(like "2011-03-05 05:15:00") 
time_object = Time.parse(time_string) 

時刻は、マシンやサーバーのタイムゾーンに応じて取得されます。 Rubyはそのような時間を解析します。それは時間がかかり、あなたのマシンのタイムゾーンを与えます(タイムゾーンは実際にはデータベースのようにUTCなので間違いです)。私はこの問題に遭遇し、データベースからの生のSQL文字列から時間を解析するときにUTCを追加することで解決しました。

time_string << " UTC" 
time_object = Time.parse(time_string) # gives time zone as UTC 

これを使用すると正しい結果が得られます。

+0

日付の最後に「UTC」を追加するとうまくいきました。ありがとう。 –

+0

これに代わる方法として、データベース内のデータを変更する必要がある場合は、ActiveRecordをローカル時間を使用するように構成することができます。これによりデータベースに「正しい」時間が保存され、あなたのアプリ。 – MDaubs

+0

@ mdaubs..uはいつもそのための関数を書くことができ、必要に応じて呼び出すことができます。 – rubyprince

3

Railsはこれを目的としています。タイムゾーンの設定を確認します。

  • config.active_record.default_timezone
  • config.time_zone

http://guides.rubyonrails.org/configuring.html#configuring-active-record

タイムゾーン機能が2.1で導入されたとあまり変わっていません。この記事は良い説明を与えます: http://mad.ly/2008/04/09/rails-21-time-zone-support-an-overview/

+0

'config.time_zone'(または' config.' anything)はRails 3で動作しないようです。 '/home/jason/snip/config/environment.rb:9:未定義のローカル変数またはメソッド'config'' –

+0

さらに、私がコンソールに行き、 'Time.zone'と入力すると、それは正しいEasternを表示します。すべての私の解析のために、私は 'Time.parse'とは​​違って' Time.zone.parse'をやっています。 –

+0

@ Jason in Rails 3では、アプリケーション変数(application.rb)*に*環境変数*を設定する必要があります。 http://edgeguides.rubyonrails.org/3_0_release_notes.html#rails-application-object – ghoppe

関連する問題