Губите представа за часовите си зони, когато извикате to_date
така че не правете това:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Когато some_date.to_datetime
, получавате екземпляр DateTime, който е в UTC, така че резултатът е нещо подобно:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
ще има час от деня 00:00:00 и часова зона UTC; 00:00:00 е правилното време от деня в @person.time_zone
но не е подходящ за UTC (освен ако, разбира се, @person
е в часовата зона +0).
И бихте могли да опростите заявката си с overlaps
:
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Имайте предвид, че overlaps
работи с полуотворени интервали:
Счита се, че всеки период от време представлява полуотворения интервал
start <= time < end
, освен ако началото и краят не са равни и в този случай представлява този единичен момент от време.