2009-08-20 73 views
2

我有所需的所有時區信息,並根據this railscast正確保存所有信息。一切正常的目的,如在表中顯示時間的一切工作,但我想知道如何將以下內容轉換爲current_users保存的時區。軌道上的紅寶石轉換爲用戶時區

我有一個發現呼叫總數每小時:

Calls.count(:group => DATE_PART('hour', start_time), 
      :conditions => ["start_time BETWEEN ? AND ?", start, finish] 

該查詢,所有的一切在開始和結束時間之間的時間所做的電話拉。唯一的問題是它將數據庫中的時間縮短爲UTC。我用Time.now.utc_offset寫了我自己的小轉換方法,但意識到這是行不通的。用什麼方法比較保存的用戶time_zone與數據庫中的內容,並添加utc_offset

time_zone存儲在數據庫中的東部時間(美國&加拿大)的字符串。

解決這個問題的最佳方法是什麼?我可以更改以將用戶的偏移量保存在數據庫中,但在我去之前,我寧願查看是否有更簡單的方法。

編輯
更清晰,查詢返回的時間和次數的哈希值。因此,例如:

   Hour      Count 
       "5"       20 
       "6"       15 
       "7"       35 
       ...       ... 

的時候要追溯到UTC偏移小時,我需要的是數字轉換爲用戶的時區,因此,例如,如果是東部時間(美國和加拿大)通過你循環散列並在小時內加-4。

編輯2
感謝Andy,我能夠很簡單地算出這個。您想要做的第一件事是將Time對象設置爲當前用戶時區。所以:

Time.zone = @current_user.time_zone 
=> "Eastern Time (US & Canada) 

然後添加當前用戶的偏移到「小時」散列

hour + Time.now.in_time_zone.utc_offset/3600 

漂亮的自我解釋裏面,而是讓你先前設置的區域的時間,並找到UTC這就是爲什麼我們除以3600的原因。

+1

你能澄清一下這個問題嗎?你只是想指定用戶時區的開始/結束時間,還是隻是想在查詢完成後將UTC時間轉換爲用戶的時區? – klochner 2009-08-20 21:38:35

+1

查詢後將UTC時間轉換爲用戶所在的時區 – Ryan 2009-08-21 01:11:31

回答

4

這是否對您有幫助?

t = TimeZone["Eastern Time (US & Canada)"] 
t.utc_to_local(DateTime.now) #gives the local time 

在我之前張貼的人刪除了他的答案(這比我的回答好得多)。如果他帶回他的回答,我會再次拿下我的。

+0

這對我來說可能足夠了,我會稍微更新。 – Ryan 2009-08-21 01:17:14

+1

非常有幫助。在向我展示後,花了10分鐘時間弄清楚我可以在用戶時區中設置時間對象。看看我的編輯,看看我做了什麼。語法是唯一真正不同的東西。 – Ryan 2009-08-21 13:15:46

0
scope :opened, where("date > '#{Time.now.in_time_zone}'") 
scope :closed, where("date < '#{Time.now.in_time_zone}'")