2011-11-02 12 views
12

Belirli bir tarihte belirli bir tarihte günün başlangıcını temsil eden bir Ruby Time nesnesini nasıl alabilirim?Belirli bir saat diliminde gün başlangıcında zaman nesnesi al

+0

Sadece Ruby'nin saat dilimi kullanımı hakkında hiçbir şey bilmediğim bir yorum: gece yarısı her zaman mevcut değil ve iki kez oluşabilir. Brezilya saatlerini gece yarısında değiştirir, örneğin. Muhtemelen günün başlangıcını bulmalısın. –

+0

İlginç bir nokta. Benim amaçlarım için günün başlangıcı, ilgilendiğim şey. Teşekkürler Jon. Soruyu güncelleyeceğim. –

+0

Gerçek kullanım durumunuz nedir? (Bu soruyu, API kota takibi için UTC olarak Kaliforniya'da en son gece yarısını almak istediğim için buldum.) –

cevap

6

I ActiveSupport::TimeZone nesne p #local yöntemi kullanarak sona Date nesnesinin bileşenlerini değerlendirmek.

# 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 

anda => 2011-11-02 00:00:00 -0400

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

anda çıktılar => 2011-11-03 00:00:00 +0800

date = Date.today 

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

anda çıktılar => 2011-11-02 00:00:00 +0800

+1

Keşke bu kadar basit olsaydı. Maalesef, saat dilimi dönüşümünden sonra, aynı saatte geldiğiniz zamanın geldiğine dair bir garanti yoktur. Bazen olacak ve bazen başlangıç ​​ve bitiş bölgesine bağlı olmayacaktır. Dönüşümden sonra tarih bileşenini orijinal değerle karşılaştırabilir ve gerekirse ayarlayabilirdim ama bu gerçekten rahatsız edici. Umduğum şey, her zaman işe yarayan, yapmanın zarif bir yoludur. Umarım api'de bir şey vardır, bunun yapmak istediği çılgın bir şey olduğunu düşünmüyorum. –

+0

Yapmaya çalıştığınız şeyi tam olarak anlayamayabilirim ama date.to_time.in_time_zone ('TIMEZONE'). Initial_of_day', belirtilen orijinal tarih için 00:00:00 UTC verir. –

+1

Size 0 UTC vermez, size saat dilimi içinde 0 verir, bu tercih edilir. Ancak, saat dilimlerini in_time_zone ile dönüştürmeden önce bunu yapmaz, böylece tarih artık geçerli değildir. İşte ne demek istediğimin örneği. date.to_time.in_time_zone ('Asya/Şangay'). midnight.in_time_zone (Time.zone) .midnight # => Geçmişte bir gün. İdeal olarak, yakut böyle bir şey yapmama izin vermeli. 'Date.to_time (alan)'. –

5

emin değil bu yardımcı olur, ama bu bana Google API kotaları sıfırlamak süreyi alırsa:

def api_calls_today 
    Call.where(updated_at: { '$gte' => last_california_midnight }).count 
end 
: örneğin,

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

Ben Mongoid ile bu gibi kullanmak

Bu, Mongo UTC olarak ayarlandığı sürece kodun hangi saat dilimi kullanıldığına bakılmaksızın çalışacaktır.