2011-11-02 186 views
12

如何獲取代表給定時區中特定日期的一天的開始時間的ruby Time對象。在特定時區的開始日期獲取時間對象

+0

只是一個評論,因爲我不知道任何有關Ruby的時區處理:午夜並不總是存在,它可能會發生兩次。例如,巴西在午夜改變時鐘。相反,您應該找到一天的開始。 –

+0

有趣的一點。爲了我的目的,我感興趣的一天的開始。感謝Jon。我會更新這個問題。 –

+0

你的實際用例是什麼? (我發現這個問題是因爲我希望得到加利福尼亞州最近的午夜,就像UTC一樣,API配額跟蹤。) –

回答

6

我最終使用的#local方法對ActiveSupport::TimeZone檢體p分配Date對象的組件。

# Get example date and time zone... 
date = Date.today 
timezone = ActiveSupport::TimeZone['America/New_York'] 

# Get beginning of day for date in timezone 
timezone.local(date.year, date.month, date.day) 
10
date = Date.today 

date.to_time.in_time_zone('America/New_York').beginning_of_day 

目前輸出=> 2011-11-02 00:00:00 -0400

Time.now.in_time_zone('Asia/Shanghai').beginning_of_day 

目前輸出=> 2011-11-03 00:00:00 0800

date = Date.today 

date.to_time.in_time_zone('Asia/Shanghai').beginning_of_day 

目前輸出=> 2011-11-02 00:00:00 0800

+1

我希望這很簡單。不幸的是,不能保證你在時區轉換後到達的時間是在同一天。有時它會,有時它不會取決於開始和結束區域。我想我可以將轉換後的日期分量與原始值進行比較,並在必要時進行調整,但這真的很笨拙。我希望的是一種優雅的方式來實現這一點。希望api中有一些東西,我不認爲這是一件想要做的事。 –

+0

我可能不完全明白你想要做什麼,但'date.to_time.in_time_zone('TIMEZONE')。beginning_of_day'給你00:00:00 UTC原始指定日期。 –

+1

它不給你0 UTC,它在時區給你0,這是更可取的。但是,在使用in_time_zone轉換時區之前,不會這樣做,因此日期不一定有效。這裏是我的意思的例子。 'date.to_time.in_time_zone('Asia/Shanghai')。midnight.in_time_zone(Time.zone).midnight#=>過去的一天。理想情況下,紅寶石應該讓我做這樣的事情。 'date.to_time(區)'。 –

5

不知道這是否會有所幫助,但是這讓我在這我的谷歌API配額重設時間:

# The most recent midnight in California in UTC time 
def last_california_midnight 
    (Time.now.utc - 7.hours).midnight + 7.hours 
end 

我這樣使用它與Mongoid,例如:

def api_calls_today 
    Call.where(updated_at: { '$gte' => last_california_midnight }).count 
end 

只要將Mongo設置爲UTC,無論將代碼部署到哪個時區,這都會起作用。

相關問題