如何根据存储的时区按日期过滤?

时间:2017-03-20 14:45:04

标签: php cakephp filter timezone php-chronos

过滤2个月

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

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

  

情况:

如果我们保存在像28-02-2017 23:55 (UTC-0)这样的数据库日期并为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);
}); 

1 个答案:

答案 0 :(得分:1)

调试您在那里创建的日期对象,它们将保存您已经过的确切日期,以及它们引用的时区的信息,因此在传递给查询时,您将进行比较对于这些确切的日期 - 数据库(层)不关心时区,它根本不知道它们。

您需要将日期转换为最初存储日期的时区,即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
}