2

私は今日、問題にあまり焦点を当てていなかったときに質問を投稿しました。ここでもっと簡潔に話せるようになります。

MySQL を使用して Windows で RoR 2.1.2 を実行しています。SQL サーバーのネイティブ タイム ゾーンは UTC です。私のローカル タイムゾーンは太平洋 (-0800) です

私は次のようなことができる :timestamp タイプの列を持つモデルを持っています:

record = Record.find(:first)
record.the_time = Time.now()

データベースで「select * from records」を実行すると、DB が UTC であることを考えると、表示される時刻は現地時間の 8 時間前になります。(単純な「select now()」と「select utc_timestamp()」で「utcで考えている」ことを確認しました)

ここからトラブルが始まります。ビューに時間を表示する場合:

<%= h record.the_time %>

...その後、UTC 形式で表示された正しい時刻が返されます。現地時間の 16:40:00 にデータベースに書き込んだ場合、データベースは 00:40:00 を示しました。

ただし、スタンドアロン スクリプトを実行している場合:

record = Record.find(:first)
puts record.the_time

...次に、データベースに保存した UTC 時刻 (00:40:00) を取得しますが、ローカル タイムゾーンを使用します。

Wed Nov 26 00:40:00 (-0800) 2008

...8時間のタイムワープ。時刻を保存すると正しく変換されるのに、取得すると正しく変換されないのはなぜですか? DB に保存されている最近の時間を比較して現在の時間と比較すると、現在の時間が短くなります。これは単なる文字列変換の問題ではないことがわかります。

何か案は?

4

4 に答える 4

1

config / environment.rbには、time_zoneを設定する設定があります。おそらく、これはスクリプトで同じに設定されていません。

# Make Time.zone default to the specified zone, and make Active Record store time values
# in the database in UTC, and return them converted to the specified local zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Uncomment to use default local time.
config.time_zone = 'UTC'

TZとフォーマットを明示的に指定することもできます。

require 'active_support/core_ext/date/conversions'
record.the_time.utc.to_s(:db) 

(または、スタンドアロンスクリプトでactive_supportを使用していない場合は、そこからコードフラグメントをだまして取得します)

于 2008-11-29T23:15:42.733 に答える
1

要求してみるactive_support

于 2008-12-02T08:03:14.273 に答える
0

サーバーまたはコンソールを再起動するという私の最後の提案について、あなたはコメントしませんでした。

私は同様の問題を抱えていましたが、そうすると修正されました。

スタンドアロン スクリプトについても言及されていますが、Rails のタイム ゾーン機能を利用するには、Rails 内でコードを実行する必要があります。

于 2008-11-26T18:12:35.057 に答える