我有一个看起来像
的表单= form.datetime_select :due_at
= form.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones
保存此对象时,我们需要它应用所选择的时区。例如,如果用户选择"03-01-2013 11:00"one_answers"中央时间(US &,我希望日期/时间(在本例中为11AM)为CST 11AM,而不是我们的应用程序默认时区"太平洋时间(US & &;加拿大)"。
这实际上是嵌套在另一个形式,所以我们不能简单地改变时间。Zone在控制器中使用一个around_filter。
如果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的字符串。