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
cevap
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)
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
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. –
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. –
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)'. –
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.
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. –
İ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. –
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.) –