我想提出一个日期时间选择在自己喜欢的时间段用户,但存储的日期时间为UTC。 目前,缺省行为是显示和使用UTC存储日期时间字段。 我怎样才能改变,而不会影响整个应用程序(即不改变应用程序的默认时区)这一领域的行为?
更新:这不是每个用户的时区。 我并不需要调整时间的显示方式。 只有这些具体领域处理不同的时区,所以我希望用户能够在这个时间段,以指定的时间。
我想提出一个日期时间选择在自己喜欢的时间段用户,但存储的日期时间为UTC。 目前,缺省行为是显示和使用UTC存储日期时间字段。 我怎样才能改变,而不会影响整个应用程序(即不改变应用程序的默认时区)这一领域的行为?
更新:这不是每个用户的时区。 我并不需要调整时间的显示方式。 只有这些具体领域处理不同的时区,所以我希望用户能够在这个时间段,以指定的时间。
这里是你如何能允许用户使用特定的时区设置一个日期:
要转换的形式提交给一个特定时间段的多参数属性,在你的控制器中添加一个方法PARAMS手动转换为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
现在的日期时间将调整为正确的时区。 但是,当用户进入到编辑的时候,表单字段仍然会显示在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)'
。 这是在轨道做了非常标准的东西。 轨道总是将数据存储在DB为UTC,但会出现/使用该应用程序时区进行加载。