5

手順:

私のローカルホスト サーバーでは、太平洋時間帯にあるブラウザーで 2013 年 1 月 18 日の午前 10 時から午前 11 時を選択します。次に、heroku の本番サーバーでまったく同じ時刻を選択します。

ご覧のとおり、データベースに保存される内容の出力は異なります。プロダクションがローカルホストとして動作し、時刻を UTC として保存するときにタイムゾーンを考慮したい。これは何が原因ですか?heroku サーバーは EST にありますが、これはこの動作の原因ではありません。

コントローラ:

  def create
    puts params[:event][:starts_at]
    @event = Event.create!(params[:event])
    puts @event.starts_at
  end

出力ローカルホスト:

2013 年 1 月 18 日金曜日 10:00:00 GMT-0800 (PST)

2013-01-18 18:00:00 UTC

出力 Heroku (本番):

2013 年 1 月 18 日金曜日 10:00:00 GMT-0800 (PST)

2013-01-18 10:00:00 UTC

スキーマ:

 t.datetime "starts_at"

環境:

Ruby on Rails 3.2.11

ルビー1.9.3

ポストグル

4

2 に答える 2

3

PostgreSQL が日付/時刻を処理する方法の背景

あなたの問題は、別のSOの質問からのこの回答でカバーされていると思います:

具体的には、この答え:

UTC次の形式の時間には、次のクエリを使用します。

SELECT * FROM tbl WHERE time_col > (now() AT TIME ZONE 'UTC')::time

ローカル タイムゾーンの時刻には、次のクエリを使用します。

SELECT * FROM tbl WHERE time_col > now()::time

Rails & ActiveRecords & 日付/時刻

このRails/Rails github issue もそれについて議論しています:

次のようなpixeltrixによるコメントがあります。

@deathbob 返信が遅くなり申し訳ありません - config.active_record.default_timezone の許容値は :utc または :local です。:utc 以外に設定すると、:local が想定されるため、表示されているのは予期される動作です。

次の変数を設定できるActiveRecordsため、常に処理されるように時間を修正するには:UTC

config.active_record.default_timezone = :utc
于 2013-01-19T22:46:55.003 に答える
0

@slm による解決策はうまくいきconfig.active_record.default_timezone = :utcませんでした。Rails はまだローカルで書き込み、Heroku で UTC で読み取りを行っていました。

だから私はそれから試しました:

config.time_zone = 'Sydney'
config.active_record.default_timezone = :local

開発中はまだ正常に機能していましたが、Heroku の postgres から日時値が UTC 形式で読み取られるようになりました。

私の一時的な回避策は、Heroku のデフォルトのタイムゾーンを次のように設定することでした。

heroku config:add TZ="Australia/Sydney"

アプリで UTC を使用したいので、これは一時的な解決策にすぎません。明確にするために、@slm が言及した rails/github issue に投稿しました。より具体的な解決策が見つかったら、回答を更新します。

于 2013-08-05T00:15:20.117 に答える