1

希望するタイムゾーンで日時選択をユーザーに提示したいのですが、日時を UTC として保存します。現在、デフォルトの動作は、UTC を使用して日時フィールドを表示および保存することです。アプリケーション全体に影響を与えずに (つまり、アプリケーションの既定のタイム ゾーンを変更せずに)、このフィールドの動作を変更するにはどうすればよいですか?

更新:これはユーザーごとのタイムゾーンではありません。時間の表示方法を調整する必要はありません。これらの特定のフィールドだけが別のタイム ゾーンを処理するため、ユーザーがこのタイム ゾーンの時刻を指定できるようにしてほしいと思います。

4

2 に答える 2

6

ユーザーが特定のタイムゾーンを使用して日付を設定できるようにする方法は次のとおりです。

フォームで送信されたマルチパラメーター属性を特定のタイム ゾーンに変換するには、パラメーターを手動で datetime オブジェクトに変換するメソッドをコントローラーに追加します。モデルの動作に影響を与えたくなかったので、これをコントローラーに追加することにしました。モデルに日付を設定して、日付が正しく設定されていると想定できるはずです。

def create
  convert_datetimes_to_pdt("start_date")
  convert_datetimes_to_pdt("end_date")
  @model = MyModel.new(params[:my_model])
  # ...
end

def update
  convert_datetimes_to_pdt("start_date")
  convert_datetimes_to_pdt("end_date")
  # ...
end

def convert_datetimes_to_pdt(field)
  datetime = (1..5).collect {|num| params['my_model'].delete "#{field}(#{num}i)" }
  if datetime[0] and datetime[1] and datetime[2] # only if a date has been set
    params['my_model'][field] = Time.find_zone!("Pacific Time (US & Canada)").local(*datetime.map(&:to_i))
  end
end

これで、datetime が正しいタイム ゾーンに調整されます。ただし、ユーザーが時刻を編集しようとすると、フォーム フィールドには UTC で時刻が表示されます。これを修正するには、次の呼び出しでフィールドをラップしますTime.use_zone

Time.use_zone("Pacific Time (US & Canada)") do
  f.datetime_select :start_date
end
于 2013-08-22T19:13:21.597 に答える