2010-09-29 69 views
3

我設置在軌道上的本地時區,在我的佈局這個JavaScript函數:如何將時間轉換爲用戶的時區中的Rails

<script type="text/javascript" charset="utf-8"> 
    <% unless session[:timezone_offset] %> 
     $.ajax({ 
       url: '/main/timezone', 
       type: 'GET', 
       data: { offset: (new Date()).getTimezoneOffset() } 
     }); 
    <% end %> 
</script> 

如果是這種接收功能:

# GET /main/timezone              AJAX 
    #---------------------------------------------------------------------------- 
    def timezone 
    # 
    # (new Date()).getTimezoneOffset() in JavaScript returns (UTC - localtime) in 
    # minutes, while ActiveSupport::TimeZone expects (localtime - UTC) in seconds. 
    # 
    if params[:offset] 
     session[:timezone_offset] = params[:offset].to_i * -60 
     ActiveSupport::TimeZone[session[:timezone_offset]] 
    end 
    render :nothing => true 
    end 

然後,我已經在我的會話偏移,所以我做這樣的事情來顯示時間:

<%= (@product.created_at + session[:timezone_offset]).strftime("%m/%d/%Y %I:%M%p") + " #{ActiveSupport::TimeZone[session[:timezone_offset]]}" %> 

是所有這在Rails 3中是非常必要的嗎?我認爲前兩個代碼塊可能是,但第三個代碼塊可能是,但第三個似乎有點過分...

回答

1

您可以設置當前時區,它將被記住的所有操作。它可以在一些非常高的控制器的before_filter中完成,比如AppController。例如

class ApplicationController < ActionController::Base 
    before_filter :set_zone_from_session 

    private 

    def set_zone_from_session 
    # set TZ only if stored in session. If not set then the default from config is to be used 
    # (it should be set to UTC) 
    Time.zone = ActiveSupport::TimeZone[session[:timezone_offset]] if session[:timezone_offset] 
    end 

end 

也許它不看的第一眼更好 - 但它會影響所有視圖,以便無需任何轉換那裏。

+0

只有這個問題纔會在那個時區保存,所以現在我的數據庫將有時間保存在不同的時區。如果它能夠跟蹤時區,那麼這可能並不糟糕......您怎麼看?這是如何正常完成的?謝謝! – Tony 2010-09-30 04:22:08

+0

它不應該保存時區 - 在正常情況下。例如,Postgres的遷移創建沒有區域信息的時間列。相同的Sqlite。所以應該沒有關於存儲時區的信息。我有一些瘋狂的想法來列出簡單的例子,使用tzones就是其中之一。但不是現在,因爲我必須爲生活做些工作:-) – 2010-09-30 07:51:25

+0

當我再次閱讀時,我有一種感覺,我不夠清楚 - 時間始終以UTC存儲,無論您的Time.zone設置如何。 – 2010-09-30 07:55:19

相關問題