如何在不同时区呈现Rails表单日期时间选择?

And*_*rew 1 ruby forms timezone datetime ruby-on-rails

我想在其首选时区向用户提供日期时间选择,但将日期时间存储为UTC.目前,默认行为是使用UTC显示和存储日期时间字段.如何在不影响整个应用程序的情况下更改此字段的行为(即不更改应用程序默认时区)?

更新:这不是每用户时区.我不需要调整时间显示方式.只有这些特定字段处理不同的时区,因此我希望用户能够指定此时区的时间.

And*_*rew 5

以下是允许用户使用特定时区设置日期的方法:

要将表单中提交的多参数属性转换为特定时区,请在控制器中添加一个方法,以手动将参数转换为日期时间对象.我选择将其添加到控制器,因为我不想影响模型行为.您仍然可以在模型上设置日期并假设您的日期设置正确.

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
Run Code Online (Sandbox Code Playgroud)

现在日期时间将调整到正确的时区.但是,当用户编辑时间时,表单字段仍将以UTC显示时间.为了解决这个问题,我们可以在调用中包裹字段Time.use_zone:

Time.use_zone("Pacific Time (US & Canada)") do
  f.datetime_select :start_date
end
Run Code Online (Sandbox Code Playgroud)