Ответ 1
Я смог компенсировать UTC, переписав свой объем следующим образом:
scope :today, where("transfer_date BETWEEN ? AND ?", Time.zone.now.beginning_of_day, Time.zone.now.end_of_day)
У меня есть область, которая запрашивает сегодня вызовы. Исходя из области, я использую ее для подсчета количества вызовов на сегодня.
Мои даты хранятся в UTC, но рельсы преобразуются в мой локальный часовой пояс. То, что я пытаюсь сделать, - найти все вызовы между сегодня в 00:00 и 23:59.
Область применения:
scope :today, where("DATE(transfer_date) BETWEEN ? AND ?", Time.zone.now.utc.beginning_of_day, Time.zone.now.utc.end_of_day)
вывод irb: (вызов, который он ловит из-за UTC)
irb(main):010:0> Call.last.transfer_date
Call Load (0.9ms) SELECT "calls".* FROM "calls" ORDER BY "calls"."id" DESC LIMIT 1
=> Sun, 07 Oct 2012 19:45:00 CDT -05:00
irb(main):011:0>
irb(main):011:0> Call.last.transfer_date.utc
Call Load (1.3ms) SELECT "calls".* FROM "calls" ORDER BY "calls"."id" DESC LIMIT 1
=> 2012-10-08 00:45:00 UTC
Я пытаюсь выяснить, как запросить только звонки, которые были между 00:00 и 23:59 на сегодня. Пока проблема с областью и без utc, zone и т.д. Не работает. Он продолжает извлекать масштаб, основанный на UTC, который включает в себя призыв со вчерашнего дня (вчера, если он отформатирован с местным часовым поясом).
Как я могу запросить между двумя моментами, чтобы получить правильный вывод? Я здесь потерялся.
Я смог компенсировать UTC, переписав свой объем следующим образом:
scope :today, where("transfer_date BETWEEN ? AND ?", Time.zone.now.beginning_of_day, Time.zone.now.end_of_day)
Вы можете использовать эксклюзивный диапазон.
scope :today, where(:transfer_date => Date.today...Date.tomorrow)
Возможно, это слишком много, но я бы предложил использовать вспомогательный метод для получения временного диапазона, а затем запрос на db. Что-то вроде
# Gets time range for x number timeunits ago
def time_range(unit, timeunit = nil)
if timeunit == "weeks"
now = Time.zone.now.beginning_of_week
elsif timeunit == "months"
now = Time.zone.now.beginning_of_month
else
now = Time.zone.now.beginning_of_day
end
# Ex: time_range(0, "days") --> Get the time range for today between the beginning of today and the beginning of tommorow - 1 second
now - unit.send(timeunit)..now + 1.send(timeunit) - 1.seconds - unit.send(timeunit)
end
поможет вам запросить диапазоны времени. Поэтому, когда вы запрашиваете что-то вроде:
time_range(0, "days")
он вернет временной диапазон за 0 дней назад (сегодня);
Wed, 07 Sep 2016 00:00:00 UTC +00:00..Wed, 07 Sep 2016 23:59:59 UTC +00:00
И тогда вы можете просто запросить объект базы данных и подсчитать все в пределах диапазона:
Calls.where(transfer_date: time_range(unit, timeunit)).count