3

我有一个看起来像的表格

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

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

这实际上嵌套在另一种形式中,因此我们不能简单地使用 around_filter 更改控制器中的 Time.zone。我们正在尝试找出一个在夏令时也可以工作的解决方案。

4

1 回答 1

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为 time zone t.to_s(:db)并将时间转换为 UTC 字符串。

于 2013-03-02T05:23:35.617 回答