Você está perdendo o controle de seus fusos horários quando liga para
to_date
então não faça isso:@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Quando você
some_date.to_datetime
, você obtém uma instância DateTime que está em UTC, então o resultado é algo assim:Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
terá um horário de 00:00:00 e um fuso horário UTC; a 00:00:00 é a hora correta do dia em
@person.time_zone
mas não é certo para UTC (a menos, é claro, @person
está no fuso horário +0). E você pode simplificar sua consulta com
overlaps
:where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Observe que
overlaps
funciona com intervalos semi-abertos:
Cada período de tempo é considerado para representar o intervalo semiabertostart <= time < end
, a menos que o início e o fim sejam iguais, caso em que representa aquele único instante de tempo.