Anda kehilangan jejak zona waktu Anda saat menelepon to_date
jadi jangan lakukan itu:
@today = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day
Saat Anda some_date.to_datetime
, Anda mendapatkan instance DateTime yang ada di UTC sehingga hasilnya seperti ini:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime
akan memiliki waktu hari 00:00:00 dan zona waktu UTC; 00:00:00 adalah waktu yang benar dalam sehari di @person.time_zone
tetapi tidak tepat untuk UTC (kecuali, tentu saja, @person
berada di zona waktu +0).
Dan Anda dapat menyederhanakan kueri Anda dengan overlaps
:
where(
'(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
:today => @today, :tomorrow => @tomorrow
)
Perhatikan bahwa overlaps
bekerja dengan interval setengah terbuka:
Setiap periode waktu dianggap mewakili interval setengah terbuka
start <= time < end
, kecuali awal dan akhir sama dalam hal ini mewakili satu waktu instan.