web-dev-qa-db-ja.com

RailsおよびPostgreSQLでタイムゾーンを完全に無視する

私はRailsとPostgresで日付と時刻を扱っており、この問題に遭遇しています:

データベースはUTCです。

ユーザーはRailsアプリでタイムゾーンを選択しますが、時刻を比較するためにユーザーの現地時間を取得する場合にのみ使用します。

ユーザーは、2012年3月17日午後7時に時間を保存します。タイムゾーンの変換やタイムゾーンを保存したくありません。日付と時刻を保存したいだけです。そのようにして、ユーザーがタイムゾーンを変更した場合、2012年3月17日午後7時に表示されます。

ユーザーが指定したタイムゾーンのみを使用して、ユーザーのローカルタイムゾーンで現在時刻の「前」または「後」のレコードを取得します。

私は現在「タイムゾーンなしのタイムスタンプ」を使用していますが、レコードを取得するとき、Rails(?)はそれらをアプリのタイムゾーンに変換しますが、これは望ましくありません。

Appointment.first.time
 => Fri, 02 Mar 2012 19:00:00 UTC +00:00 

データベース内のレコードはUTCとして出力されるように見えるため、私のハックは現在の時刻を取得し、「Date.strptime(str、 "%m /%d /%Y")」でタイムゾーンを削除してからそれでクエリ:

.where("time >= ?", date_start)

周りのタイムゾーンを無視するだけの簡単な方法が必要なようです。何か案は?

151
99miles

デフォルトでUTCで処理する場合:

config/application.rb、 追加:

config.time_zone = 'UTC'

次に、現在のユーザーを保存する場合、タイムゾーン名はcurrent_user.timezoneあなたは言うことができます。

post.created_at.in_time_zone(current_user.timezone)

current_user.timezoneは有効なタイムゾーン名でなければなりません。そうでなければ、ArgumentError: Invalid Timezoneフルリスト を参照してください。

1
Dorian