如何按存储时区的日期进行过滤?



在 2 个月之间过滤

我需要根据所选月份过滤数据。

我们正在UTC-0中保存数据,需要在UTC+1中读取数据。

情况:

如果我们像28-02-2017 23:55 (UTC-0)一样保存在 DB 日期中并为 3 月 (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(CakeChronosChronos) {
'time' => '2017-02-28 23:00:00.000000',
'timezone' => 'UTC',
'hasFixedNow' => false
}
object(CakeChronosChronos) {
'time' => '2017-03-31 22:00:00.000000',
'timezone' => 'UTC',
'hasFixedNow' => false
}

最新更新