我想在他们的首选时区向用户展示一个日期时间选择,但将日期时间存储为 UTC。目前,默认行为是使用 UTC 显示和存储日期时间字段。如何在不影响整个应用程序的情况下更改此字段的行为(即不更改应用程序默认时区)?
更新:这不是每个用户的时区。我不需要调整时间的显示方式。只有这些特定字段处理不同的时区,所以我希望用户能够指定这个时区的时间。
我想在他们的首选时区向用户展示一个日期时间选择,但将日期时间存储为 UTC。目前,默认行为是使用 UTC 显示和存储日期时间字段。如何在不影响整个应用程序的情况下更改此字段的行为(即不更改应用程序默认时区)?
更新:这不是每个用户的时区。我不需要调整时间的显示方式。只有这些特定字段处理不同的时区,所以我希望用户能够指定这个时区的时间。
以下是允许用户使用特定时区设置日期的方法:
要将表单中提交的多参数属性转换为特定时区,请在控制器中添加一个方法以手动将参数转换为日期时间对象。我选择将此添加到控制器中,因为我不想影响模型行为。您应该仍然可以在模型上设置日期并假设您的日期设置正确。
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
现在日期时间将调整为正确的时区。但是,当用户去编辑时间时,表单字段仍会以 UTC 显示时间。为了解决这个问题,我们可以将字段包装在对以下的调用中Time.use_zone
:
Time.use_zone("Pacific Time (US & Canada)") do
f.datetime_select :start_date
end
有几个选项:
config.time_zone = 'Mountain Time (US & Canada)'
。这是在rails中做的非常标准的事情。Rails 将始终将数据以 UTC 格式存储在数据库中,但将使用应用程序时区显示/加载它。