2017-03-20 27 views
0

2个月之间过滤如何按日期过滤它们存储的时区?

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

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

现状:

如果我们在DB日期像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); 
}); 

回答

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 
} 
+0

谢谢!我被教导'欧洲/维也纳'会自动将给定的DateTime转换为-1。 – JohnWayne