1

多くの異なるタイムゾーンを使用するアプリケーションがあります...それらをコントローラーに設定し、ユーザーに応じて変更します。すべての時間は、タイムスタンプなどなしで UTC で保存されます。

私の理解では、これは Rails がタイムゾーンを処理する通常の方法です。これは、Postgres で直接何かを行う必要があり、タイムゾーンが問題になるまで、99% の確率で問題なく動作します。

たとえば、このクエリは GMT を除いて完全に間違っています。たとえば、中央タイム ゾーンでは、設定された時間に応じて、間違った日が取得されます。

Events.where("EXTRACT(dow FROM start_at)", Date.today.wday)

特定の日に該当するすべての日付を見つけようとしているところ。

私はこのようなことをしようとしています。タイムゾーン間で検索する必要はありません (それらは混在しません) が、正しい結果を得るために UTC でない場合はタイムゾーンを指定する必要があります。

User.events.where("EXTRACT(dow FROM start_at AT TIME ZONE ?) = ?", 'UTC', Date.today.wday)

しかしTime.zone、Postgres の TIME ZONE で動作するものを提供するために使用する方法がわかりません。

Time.zone.tzinfo は時々動作します...Postgres は「Europe/Warsaw」で動作しますが、Rails は「Europe - Warsaw」を返します

一般的に、私はタイムゾーンであまり運がありません。ポインタがあれば幸いです。

4

3 に答える 3

4

他の誰かがより良い全体的な解決策を持っているかもしれませんが、特定のクエリに必要なのは

Time.zone.tzinfo.identifier

または、あなたの例では:

User.events.where("EXTRACT(dow FROM start_at AT TIME ZONE ?) = ?", Time.zone.tzinfo.identifier, Date.today.wday)
于 2013-10-03T16:14:06.420 に答える
1

Rails ActiveSupport::TimeZoneを使用する代わりに、Ruby TZInfo gem を直接使用してみてください。

または、 ActiveSupport::TimeZoneMAPPINGドキュメントに示されているように定数を使用すると、Rails タイム ゾーン キーから、Postgres などで使用される標準の IANA タイム ゾーン識別子に戻ります。

于 2013-10-03T23:59:49.787 に答える