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