如何呈现Rails的形式,日期时间在不同的时区选择?(How to present Rails fo

2019-10-18 12:41发布

我想提出一个日期时间选择在自己喜欢的时间段用户,但存储的日期时间为UTC。 目前,缺省行为是显示和使用UTC存储日期时间字段。 我怎样才能改变,而不会影响整个应用程序(即不改变应用程序的默认时区)这一领域的行为?

更新:这不是每个用户的时区。 我并不需要调整时间的显示方式。 只有这些具体领域处理不同的时区,所以我希望用户能够在这个时间段,以指定的时间。

Answer 1:

这里是你如何能允许用户使用特定的时区设置一个日期:

要转换的形式提交给一个特定时间段的多参数属性,在你的控制器中添加一个方法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


Answer 2:

有几个选项:

  • 显示数据时,他们利用用户的本地时区。 这是有点像浏览器的时区,轨道宝石真的很容易。 见https://github.com/kbaum/browser-timezone-rails 。 它基本上是覆盖基于从浏览器检测出的时区的每个请求的应用程序时区。 注意:它仅使用操作系统的时区,所以它不是准确的,因为基于IP /地理位置解决方案。
  • 安装应用程序时区,使其与广大用户群的一致。 例如: config.time_zone = 'Mountain Time (US & Canada)' 。 这是在轨道做了非常标准的东西。 轨道总是将数据存储在DB为UTC,但会出现/使用该应用程序时区进行加载。
  • 为您的用户模型一个时区。 允许用户设置自己的帐户设置这个值。 而且,然后用类似的方法,它上面的宝石在application_controller一样。


文章来源: How to present Rails form datetime select in different time zone?