我的表格看起来像
= 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。我们正试图找出一个在夏令时期间有效的解决方案。
答案 0 :(得分:3)
如果due_at
和time_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字符串。