Když zavoláte to_date
, ztrácíte přehled o svých časových pásmech tak to nedělej:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Když some_date.to_datetime
, získáte instanci DateTime, která je v UTC, takže výsledek je něco takového:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
bude mít denní čas 00:00:00 a časové pásmo UTC; 00:00:00 je správný čas dne v @person.time_zone
ale není to vhodné pro UTC (samozřejmě pokud @person
je v časovém pásmu +0).
A můžete svůj dotaz zjednodušit pomocí overlaps
:
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Všimněte si, že se overlaps
pracuje s pootevřenými intervaly:
Každé časové období je považováno za napůl otevřený interval
start <= time < end
, pokud nejsou začátek a konec stejné, v takovém případě představuje tento jediný časový okamžik.