1

environment.rb の config.time_zone を「UTC」に設定しており、「select now();」を発行すると、mySQL サーバーは現在の時刻をローカル タイム ゾーンで返します。「select utc_timestamp;」を要求すると、utc で

Rails 2.1.2、mysql gem 2.7.3、activerecord gem 2.1.2 を実行しています。mysql --version は、「Win32 (ia32) 用の Ver 14.12 Distrib 5.0.27」を返します。

編集: 私の environment.rb は UTC に設定されており、プロジェクトを開始して以来ずっとそうでした。サーバーを再起動しても、変更は反映されません。

record = Record.find(:first)
puts Time.now
# Tue Nov 25 17:40:48 -0800 2008
record.time_column = Time.now
record.save

mysql> select * from records;
---------------------
 2008-11-26 01:40:48

#note that this is the same time, in UTC.

record = Record.find(:first)
puts record.time_column
Wed Nov 26 01:40:48 -0800 2008

#NOTE that this is eight hours in advance!  
#All I've done is store a date in the database and retrieve it again!

これを引き起こす原因は何ですか?

4

3 に答える 3

5

日付、タイムゾーン、MySQL に関しても同じ問題がありました。後者は、構成されているタイムゾーンで日付/時刻の値を提供することを前提としています。

ただし、Rails が UTC で時間を処理するように構成したため、ActiveRecord は値を使用する前に、日付/時刻の値を UTC に変換します (したがって、Tue Nov 25 17:40:48 -0800 2008 は Wed Nov 26 01:40:48 0000 2008 になります)。 SQL update/create クエリで生成し、MySQL に送信します。

疑似コードで

("time = %t", Tue Nov 25 17:40:48 -0800 2008) => "time = '2008-11-26 01:40:48'

MySQLでは 2008-11-26 01:40:48 -0800と見なされます。

デバッグ ログ ファイルを見れば、私の言いたいことがわかるでしょう。Rails と MySQL で同じタイムゾーンを UTC に設定することによってのみ、適切に機能する (つまり、悪い驚きがないことを意味します) 方法があります。これが私たちが使用する構成です。

于 2008-11-26T10:40:04.427 に答える
1

おそらくあなたが望む答えではありませんが、一致する時間を取得するための鍵は、Rails の土地ですべてのタイムゾーンベースのロジックを処理し、データベースを愚かに保つことであることがわかりました。

これは、timezones/utc の実装が信じられないほどバグが多かった/壊れていた Rails 2.0 に戻っていたので、現在は改善されている可能性があります。

于 2008-11-27T08:41:47.330 に答える
0

environment.rbファイルを編集した後、データベースに新しいレコードを作成する前にサーバーを再起動しましたか?

于 2008-11-26T06:54:32.680 に答える