Как отфильтровать по датам по часовому поясу, в котором они были сохранены?

Фильтрация между 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);
});

0

Решение

Отладьте объекты даты, которые вы создали там, они будут содержать точную дату, которую вы передали, и информацию о том, на какой часовой пояс они ссылаются, следовательно, при передаче в запрос вы будете сравнивать с этими точными датами — базой данных (слой) не заботится о часовых поясах, он не имеет никакого понятия о них вообще.

Вам необходимо преобразовать даты в часовой пояс, в котором они были изначально сохранены, то есть в 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
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]