Bạn đang mất dấu múi giờ khi gọi to_date
vì vậy đừng làm điều đó:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Khi bạn some_date.to_datetime
, bạn nhận được một phiên bản DateTime ở UTC, do đó kết quả của một cái gì đó như thế này:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
sẽ có thời gian trong ngày là 00:00:00 và múi giờ là UTC; 00:00:00 là giờ chính xác trong ngày ở @person.time_zone
nhưng không phù hợp với UTC (tất nhiên, trừ khi @person
ở múi giờ +0).
Và bạn có thể đơn giản hóa truy vấn của mình bằng overlaps
:
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Lưu ý rằng overlaps
hoạt động với khoảng thời gian nửa mở:
Mỗi khoảng thời gian được coi là đại diện cho khoảng thời gian nửa mở
start <= time < end
, trừ khi bắt đầu và kết thúc bằng nhau, trong trường hợp đó, nó biểu thị thời điểm duy nhất đó.