1

나는 타임 스탬프를 얻고 그 타임 스탬프의 해당 날짜에 대한 모든 예약을 검색해야하는 시나리오가 있습니다. 타임 스탬프는 사용자의 각 시간대이며 데이터베이스의 모든 레코드는 UTC로 저장됩니다. 그래서 자연스럽게 그 타임 스탬프를 UTC로 변환 한 다음 검색해야합니다. 내가 다음 쿼리를 사용할 때 그것은 나를을 제공루비 시간대 변환 문제

Booking.where("date_time >= '#{DateTime.parse(timestamp).in_time_zone('UTC').beginning_of_day}' and date_time <= '#{DateTime.parse(timestamp).in_time_zone('UTC').end_of_day}'") 

기본적으로

그러나 마지막까지 일의 처음부터 모든 예약을 가져 의미 : 여기

내가하고있어 뭔가 다른 결과 :

실제로 사용 사례에서 올바른 설명이 무엇인지 궁금해하며 여기에 의견을 보내 주시면 감사하겠습니다.

답변

1

나는 둘 중 하나를 사용하지 않을 것이다. 이것은

:

DateTime.parse(timestamp).in_time_zone('UTC').beginning_of_day 

는 당신에게 UTC 하루의 시작, UTC 오프셋 로컬 시간대 일이 아닌 시작을 제공합니다. 간단히 말해서, 그것은 부정확하고 당신이 찾고있는 것을 당신에게주지 않을 것입니다. 이것은

:이 지역 시간대에 하루의 시작 시간을 변경하고 UTC에 타임 스탬프를 변환으로

DateTime.parse(timestamp).beginning_of_day.in_time_zone('UTC') 

올바른 것입니다.

자리 표시자를 사용하여 인용 부호를 처리하게하면 UTC 조정 자체가 적용됩니다.

타임 스탬프 잘림 및 정밀도 문제를 피하려면 <= t.end_of_day이 아닌 < t.tomorrow.beginning_of_day도 사용해야합니다. 하루의 끝은 23:59:59.999에있는 것으로 간주됩니다. 그러면 오류가 잠잠해질 수있는 작은 창을 남길 수 있습니다. 저는 여기 꽤 상식적입니다.

나는 아마 이런 식으로 할 거라고 :

t = DateTime.parse(timestamp) 
Booking.where('date_time >= :start and date_time < :end', 
    :start => t.beginning_of_day, 
    :end => t.tomorrow.beginning_of_day 
)