Du tappar koll på dina tidszoner när du ringer to_date
så gör inte det:
@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-instans som är i UTC så resultatet av något i stil med detta:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
kommer att ha en tid på dagen på 00:00:00 och en tidszon UTC; 00:00:00 är rätt tid på dagen i @person.time_zone
men inte rätt för UTC (såvida inte, naturligtvis, @person
är i tidszonen +0).
Och du kan förenkla din fråga med overlaps
:
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Observera att overlaps
fungerar med halvöppna intervaller:
Varje tidsperiod anses representera halvöppet intervall
start <= time < end
, såvida inte start och slut är lika i vilket fall det representerar det enstaka tidsögonblicket.