0

Rails アプリケーションにカレンダーを追加しました。開始日と終了日 (時間と分を含む) を持つイベントがあります。これはイベント テーブルのフィールドで、実際の形式は datetime です。特定のイベントの開始日、終了日、タイトル、説明などを選択すると、パラメータ ハッシュは次のようになります。

parameters = {"event" => {"title" => "a title", "description" => "a description", "start_date" => "2012-09-23 23:45", "end_date" => "2012-09-24 15:32"}}

イベントコントローラーには、次のようなものがあります。

Event.create(:title => params[:event][:title],
             :description => params[:event][:description],
             :start_date => params[:event][:start_date].present? ? DateTime.strptime(params[:event][:start_date], "%Y-%m-%d %H:%M") : nil,
             :end_date => params[:event][:end_date].present? ? DateTime.strptime(params[:event][:end_date], "%Y-%m-%d %H:%M") : nil,
             ...
            )

このイベントがデータベース (mysql) に保存されると、開始日の値は「2012-09-23 20:45」で、終了日の値は「2012-09-24 12:32」です。Rails が自動的にタイムゾーンを処理していることは理解しています。私の問題は、特定の時間 (たとえば、今日発生するすべてのイベント) のすべてのイベントを取得する場合、次のようにすることです。

query = "((start_date between ? AND ?) OR (end_date between ? AND ?))"
query << "title NOT LIKE ? AND ..."
self.events.where(query, 
                  Time.now.beginning_of_day, Time.now.end_of_day, 
                  Time.now.beginning_of_day, Time.now.end_of_day, 
                  some_restriction_here, ...)

間違ったイベントを取得します。(データベースの日付と時刻が入力と異なる理由は明らかです)。明らかな解決策もあります。すべてのイベントをメモリに入れると、日付と時刻が再び元の状態になりますが、これはリソースの面で高価です。一方、これはタイムゾーンの問題を解決しません。中国の誰かがイベントを作成した場合、データベースの値はサーバーのローカリゼーションの時間オフセットに関連します。ユーザーがタイムゾーンを設定し、そのユーザーの特定の日付を保存してこれを操作できるフィールドをどこかに置くことができます。これに対処するための最良の方法についてのあなたの提案は何ですか?

4

1 に答える 1

0

Railsは、すべての日付をUTC形式でデータベースに保存します。したがって、1つの方法は、常にUTCで操作を実行し、ビューで表示された日付を現在のタイムゾーンに変換することです。もう1つの方法は、すべてのアクションの開始時にRailsのタイムゾーンを変更することです。解析されたすべての時刻と日付は、カスタムタイムゾーンになります。

def action_name
  Time.zone = "Prague"
  # ... logic
end
于 2012-09-23T12:40:29.473 に答える