2013-08-21 43 views
1

我想給他們的首選時區的用戶提供日期時間選擇,但將日期時間存儲爲UTC。目前,默認行爲是使用UTC顯示和存儲日期時間字段。如何更改此字段的行爲而不影響整個應用程序(即不更改應用程序的默認時區)?如何在不同的時區顯示選擇日期時間的導軌?

更新:這不是每個用戶的時區。我不需要調整顯示時間的方式。只有這些特定的字段處理不同的時區,所以我希望用戶能夠在此時區中指定時間。

+0

你有沒有嘗試使用[::的ActiveSupport時區(http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html)或[TZInfo](http://tzinfo.github.io/)寶石?或者您在尋找客戶端JavaScript解決方案嗎?顯示一些代碼或許? :) –

+0

不,客戶端。是的,在特定區域顯示時間時,我已經使用標準時區幫助程序,即Time.now.in_time_zone(「太平洋時間(美國和加拿大)」)。但是,現在我需要改變表單顯示值與給定時區的關係。 – Andrew

回答

0

有幾個選項:顯示數據時,他們

  • 利用用戶的本地時區。這對於瀏覽器時區欄rails這樣的東西來說非常簡單。見https://github.com/kbaum/browser-timezone-rails。它基本上基於從瀏覽器檢測到的時區覆蓋每個請求的應用程序時區。注意:它只使用操作系統時區,所以它不如基於IP /地理位置的解決方案准確。
  • 設置您的應用程序時區,以便它與大多數用戶羣一致。例如:config.time_zone = 'Mountain Time (US & Canada)'。這在rails中是非常標準的事情。 Rails將始終將數據作爲UTC存儲在數據庫中,但會使用應用程序時區顯示/加載它。
  • 爲您的用戶模型創建一個時區。允許用戶在其帳戶設置中設置此值。然後,在application_controller中使用類似上述gem的方法。
+0

感謝您的回答。對不起,我不清楚。這不是每個用戶的時區,而是與應用程序的默認時區不同的特定時區。我只需要調整表單顯示時間選擇的方式。它應該顯示應用時區偏移量的值。 – Andrew

+0

我認爲您需要在顯示錶單之前將日期時間轉換爲所需的時區。您可以使用Time.use_zone的塊形式來執行此操作。 – steakchaser

+1

Time.use_zone('您想使用的時區')做 study_at = Time.zone.parse('datetime string') end – steakchaser

5

這裏是你如何讓用戶使用特定的時區設置日期:

要轉換的形式提交給一個特定時間段的多參數屬性,添加方法您的控制器手動將參數轉換爲日期時間對象。我選擇將其添加到控制器中,因爲我不想影響模型行爲。您仍然應該能夠在模型上設置日期並假定您的日期設置正確。

def create 
    convert_datetimes_to_pdt("start_date") 
    convert_datetimes_to_pdt("end_date") 
    @model = MyModel.new(params[:my_model]) 
    # ... 
end 

def update 
    convert_datetimes_to_pdt("start_date") 
    convert_datetimes_to_pdt("end_date") 
    # ... 
end 

def convert_datetimes_to_pdt(field) 
    datetime = (1..5).collect {|num| params['my_model'].delete "#{field}(#{num}i)" } 
    if datetime[0] and datetime[1] and datetime[2] # only if a date has been set 
    params['my_model'][field] = Time.find_zone!("Pacific Time (US & Canada)").local(*datetime.map(&:to_i)) 
    end 
end 

現在日期時間將被調整到正確的時區。但是,當用戶編輯時間時,表單字段仍將以UTC顯示時間。爲了解決這個問題,我們可以換一個呼叫字段Time.use_zone

Time.use_zone("Pacific Time (US & Canada)") do 
    f.datetime_select :start_date 
end 
相關問題