2013-03-01 54 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