2013-07-23 36 views
0

我有一個AWS服務器,可以在我們的用戶基礎上運行每日cron作業報告。我想確保我的報告在前一天的全天運行。目前我使用這個作爲代碼數據queringRails時區和cron調度

Time.new(Time.now.year, Time.now.month, Time.now.day).yesterday.beginning_of_day.in_time_zone('MST)..Time.new(Time.now.year, Time.now.month, Time.now.day).yesterday.end_of_day.in_time_zone('MST) 

我看它是壞的做法是使用Time.now因爲這是系統(UTC)的時間?我想知道我在做什麼是一個很大的不不,或者如果有一個更有效的方法?

謝謝!

+0

您有任何其他問題或我的答案適用於您的問題嗎? – Powers

回答

2

Mountain標準時間比UTC UTC時間晚7個小時,因此當您從MST 7月22日那天捕獲所有數據點時,您希望UTC時間從UTC時間7/22 UTC到7/23 at 7:00上午7:00 UTC。

我不認爲你的代碼是正確的,因爲你在beginning_of_day之後致電in_time_zone("MST")

當您運行是UTC在服務器上的代碼,評估的時間是不同的:

>> Time.new.yesterday.beginning_of_day.in_time_zone('MST').utc 
=> 2013-07-22 00:00:00 UTC 
>> Time.new.in_time_zone("MST").yesterday.beginning_of_day.utc 
=> 2013-07-22 07:00:00 UTC 

這裏是如何確定的開始和結束時間正確:

>> t = Time.new 
=> 2013-07-23 19:45:10 +0000 
>> start_time = t.in_time_zone("MST").yesterday.beginning_of_day 
=> Mon, 22 Jul 2013 00:00:00 MST -07:00 
>> end_time = t.in_time_zone("MST").yesterday.end_of_day 
=> Mon, 22 Jul 2013 23:59:59 MST -07:00 

當我們將開始和結束時間轉換爲UTC時,我們會得到所需的結果。

>> start_time = t.in_time_zone("MST").yesterday.beginning_of_day.utc 
=> 2013-07-22 07:00:00 UTC 
>> end_time = t.in_time_zone("MST").yesterday.end_of_day.utc 
=> 2013-07-23 06:59:59 UTC 
+0

當代碼中兩個位置執行'Time.new'與一天中的更改時刻重疊時,此代碼將導致錯誤。 – sawa

+0

@sawa - 感謝您的評論。時區總是讓我困惑,我同意在兩個地方調用Time.new會導致小錯誤。不過,我認爲在'beginning_of_day'之後調用'in_time_zone'會導致更大的7小時錯誤。無論如何,我根據您的評論更新了代碼。 – Powers

0

我不知道你正在嘗試做的,但

Time.new(Time.now.year, Time.now.month, Time.now.day) 

絕對是一個可怕的代碼片段。例如,如果Time.now.year的執行時間與Time.now.month的執行時間之間的時間滯後與年份的更改時刻重疊,則主要使用Time.new創建的時間對象將不是這兩個時刻中的一個。如果你想獲得當前時間,只是做

Time.new 

Time.now 

如果你想創建計算出的一個時間,一個時間範圍內,那麼無論你的代碼應該是,創建時間只有一次:

t = Time.now 

和使用,在你的代碼的其餘部分:

t.some_method..t.some_other_method 
+0

我想獲取前一天的開始和結束時間 – BC00