如何在Rails表单中的datetime_select上应用时区

时间:2013-03-01 22:10:47

标签: ruby-on-rails datetime timezone

我的表格看起来像

= form.datetime_select :due_at
= form.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones

保存此对象时,我们需要它来应用所选的时区。例如,如果用户选择“03-01-2013 11:00”和“Central Time(US& Canada)”,我想要日期/时间,在这种情况下,11AM是11AM CST而不是我们的应用程序默认时间“太平洋时间(美国和加拿大)”区。

这实际上嵌套在另一个表单中,因此我们不能简单地使用around_filter更改控制器中的Time.zone。我们正试图找出一个在夏令时期间有效的解决方案。

1 个答案:

答案 0 :(得分:3)

如果due_attime_zone都是单个模型的属性,那么您可以使用before_save挂钩确保在due_at的时区中编码time_zone在存储到数据库之前。

class YourModel < ActiveRecord::Base
  before_save :apply_time_zone

  protected

  def apply_time_zone
    self.due_at = ActiveSupport::TimeZone[time_zone].parse "#{due_at_start.to_s(:db)} UTC"
  end
end

ActiveSupport::TimeZone[t].parse(s)会将s解析为时区t,而.to_s(:db)会将时间转换为UTC字符串。