2013-03-01 45 views
3

我有一个看起来像如何在datetime_select申请时区Rails的形式

= 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。我们正在尝试找出一种夏令时工作的解决方案。

+1

模型上的'due_at'和'time_zone'属性都是? – 2013-03-02 05:09:15

+0

@BenjaminSullivan是的,在这种情况下'due_at'和'time_zone'是模型上的属性。 – user394016 2013-03-05 01:28:38

回答

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。

+0

感谢您的编辑,我最近写了很多javascript哈哈。答案是否解决了您的问题? – 2013-03-05 11:04:29

+0

您可以参考源代码或示例,其中'#to_s(:db)'将时间转换为UTC,如您在修订中所述?据我可以告诉'#to_s'用':db'只是执行'strftime'而没有任何时区变化。我在Rails 2.3中的测试证实了这一点。 https://github.com/rails/rails/blob/508f33f35c9ce7a8973c1cf3466223313dfcfb24/activesupport/lib/active_support/core_ext/time/conversions.rb – 2013-03-08 13:19:27