Фильтрация между 2 месяцами
Мне нужно отфильтровать данные на основе выбранного месяца.
Мы сохраняем данные в UTC-0
и нужно читать данные в UTC+1
,
Ситуация:
Если мы сохраним в БД дату вроде 28-02-2017 23:55 (UTC-0)
и сделать фильтр на март (03-2017) я должен увидеть этот вклад в результаты (UTC+1
) и если у нас есть вход как 31-03-2017 23:55 (UTC-0)
Я не должен видеть этот вклад в результатах (UTC+1
).
Пытаться:
$fromDate = new Chronos('2017-03-01 00:00:00', 'Europe/Vienna');
$toDate = new Chronos('2017-04-01 00:00:00', 'Europe/Vienna');
$q = $this->Users->find('all')
->where(function ($exp, $q) use ($fromDate, $toDate) {
return $exp->between('Users.created', $fromDate, $toDate);
});
Отладьте объекты даты, которые вы создали там, они будут содержать точную дату, которую вы передали, и информацию о том, на какой часовой пояс они ссылаются, следовательно, при передаче в запрос вы будете сравнивать с этими точными датами — базой данных (слой) не заботится о часовых поясах, он не имеет никакого понятия о них вообще.
Вам необходимо преобразовать даты в часовой пояс, в котором они были изначально сохранены, то есть в UTC:
$fromDate = new Chronos('2017-03-01 00:00:00', 'Europe/Vienna');
$fromDate = $fromDate->setTimezone('UTC');
$toDate = new Chronos('2017-04-01 00:00:00', 'Europe/Vienna');
$toDate = $toDate->setTimezone('UTC');
Даты теперь должны выглядеть так:
object(Cake\Chronos\Chronos) {
'time' => '2017-02-28 23:00:00.000000',
'timezone' => 'UTC',
'hasFixedNow' => false
}
object(Cake\Chronos\Chronos) {
'time' => '2017-03-31 22:00:00.000000',
'timezone' => 'UTC',
'hasFixedNow' => false
}
Других решений пока нет …