जब आप to_date
. पर कॉल करते हैं, तो आप अपने समय क्षेत्र का ट्रैक खो रहे होते हैं तो ऐसा न करें:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
जब आप some_date.to_datetime
, आपको डेटटाइम इंस्टेंस मिलता है जो यूटीसी में होता है इसलिए कुछ इस तरह का परिणाम होता है:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
00:00:00 का समय-समय पर और UTC का एक समय क्षेत्र होगा; @person.time_zone
. में 00:00:00 दिन का सही समय है लेकिन यूटीसी के लिए सही नहीं है (जब तक कि, निश्चित रूप से, @person
+0 समय क्षेत्र में है)।
और आप overlaps
. के साथ अपनी क्वेरी को आसान बना सकते हैं :
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
ध्यान दें कि overlaps
आधे खुले अंतराल के साथ काम करता है:
प्रत्येक समय अवधि को आधे खुले अंतराल का प्रतिनिधित्व करने के लिए माना जाता है start <= time < end
, जब तक कि प्रारंभ और अंत बराबर न हों, उस स्थिति में यह उस एकल समय को तत्काल दर्शाता है।