Tracisz kontrolę nad strefami czasowymi, dzwoniąc do to_date
więc nie rób tego:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Kiedy some_date.to_datetime
, otrzymasz instancję DateTime, która jest w UTC, więc wynik czegoś takiego:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
będzie miał godzinę 00:00:00 i strefę czasową UTC; 00:00:00 to poprawna pora dnia w @person.time_zone
ale nie jest odpowiedni dla UTC (chyba że, oczywiście, @person
jest w strefie czasowej +0).
I możesz uprościć zapytanie dzięki overlaps
:
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Zauważ, że overlaps
działa z przerwami półotwartymi:
Każdy okres jest uważany za reprezentujący przedział półotwarty start <= time < end
, chyba że początek i koniec są równe, w którym to przypadku reprezentuje ten pojedynczy moment.