2012-08-14 58 views
0

因此,在設置Time.zone時,我在視圖中看到日期不一致的結果。我希望有人能告訴我發生了什麼事。我有Ruby應用程序運行在Ubuntu服務器上的Rails應用程序12.04Time.zone&in_time_zone在視圖中顯示錯誤的時間

在我的應用程序控制器中,我有一個before_filter從current_user公司的time_zone記錄中設置Time.zone。

before_filter :set_user_time_zone 

private 

def set_user_time_zone 
    Time.zone = current_user.company.time_zone if user_signed_in? 
end 

我與測試用戶是在「中部時間(美國&加拿大)」

原始數據庫記錄是2012年8月13日二十點10分54秒

在我認爲我使用下面的代碼格式化日期:

servicedata.service_last_run_time.strftime('%b %e, %Y %l:%M%P') 

我希望回到「2012年8月13日下午8:10」這將是在「中部時間上面的記錄(美國&加拿大)「但是我得到」2012年8月13日上午9:10「

我在軌道控制檯測試相同的代碼,它工作正常。我不確定它爲什麼不工作。

在我找到before_filter的想法之前,我只是在所有視圖中鏈接「in_time_zone」,但獲得相同的結果。例如

servicedata.service_last_run_time.in_time_zone(current_user.company.time_zone).strftime('%b %e, %Y %l:%M%P') 

同樣都Time.zone或手動鏈接in_time_zone到日期對象中軌控制檯,但在意見工作正常返回一個可怕的錯誤的時間。

我測試的服務器時間,以確保它們是不變UTC從以下方面:

Rails Console : 2012-08-14 02:06:29 +0000 
Ubuntu Shell: Tue Aug 14 02:06:38 UTC 2012 

我不知道什麼,我在這裏失蹤。

回答

0

要使用I18n.localize - 見http://guides.rubyonrails.org/i18n.html,特別是 - http://guides.rubyonrails.org/i18n.html#adding-date-time-formats

在配置/當地人

/en.yml已經有一些內置的格式,你可以使用,你可以添加自己爲好,所以你可以做

<%= I18n.localize(servicedata.service_last_run_time, :format => :long) %> 

,你可以添加自己的配置,只需使用新定義的鍵格式ARG

<%= I18n.localize(servicedata.service_last_run_time, :format => :my_super_special_format) %> 

注意你可以寫這4點不同的方式,他們都是一樣的,當你在一個軌道查看

<%= I18n.localize(servicedata.service_last_run_time, :format => :long) %> 
<%= I18n.l(servicedata.service_last_run_time, :format => :long) %> 
<%= localize(servicedata.service_last_run_time, :format => :long) %> 
<%= l(servicedata.service_last_run_time, :format => :long) %> 

如果日期時間價值爲零,將拋出一個異常(不幸的),所以如果無有效增加一些條件語句

<%= localize(servicedata.service_last_run_time, :format => :long) if servicedata.service_last_run_time %> 
+0

'I18n.localize'方法知道你的控制器中的'Time.zone'設置,它知道如何從UTC調整到Time.zone - 你試過了嗎? – house9 2012-08-14 15:00:40

0

我弄明白了什麼是錯的。這不是我在time_zone中顯示日期的方法

我不知道我試圖顯示的記錄來自計算機報告,當計算機報告它抓取機器的當前時區時。

所以我試圖花一點時間在中央並再次轉換它。哎呀。