Du mister overblikket over dine tidszoner, når du ringer til to_date
så gør det ikke:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Når du some_date.to_datetime
, får du en DateTime-forekomst, der er i UTC, så resultatet af noget som dette:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
vil have et klokkeslæt på 00:00:00 og en tidszone på UTC; 00:00:00 er det korrekte tidspunkt på dagen i @person.time_zone
men ikke rigtigt for UTC (medmindre, selvfølgelig, @person
er i +0 tidszonen).
Og du kan forenkle din forespørgsel med overlaps
:
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Bemærk, at overlaps
virker med halvåbne intervaller:
Hver tidsperiode anses for at repræsentere det halvåbne interval start <= time < end
, medmindre start og slut er ens, i hvilket tilfælde det repræsenterer det enkelte tidsøjeblik.