Php Doctrine Mongodb ODM和日期时间查询

Php Doctrine Mongodb ODM和日期时间查询,php,mongodb,symfony,doctrine-orm,doctrine-odm,Php,Mongodb,Symfony,Doctrine Orm,Doctrine Odm,在这个问题上我需要一些帮助。我正在使用Symfony2+mongodb+原则创建一个应用程序。 我只想使用Doctrine ODM查询过去5分钟内登录的所有用户。我有一个用户集合,其中有一个名为date\u last\u login的日期字段 因此,我尝试这样使用querybuilder: <?php // Creating a DateTime object and susbtract 5 min from now // local time is 15:40:05, timezone:

在这个问题上我需要一些帮助。我正在使用Symfony2+mongodb+原则创建一个应用程序。 我只想使用Doctrine ODM查询过去5分钟内登录的所有用户。我有一个用户集合,其中有一个名为date\u last\u login的日期字段

因此,我尝试这样使用querybuilder:

<?php
// Creating a DateTime object and susbtract 5 min from now
// local time is 15:40:05, timezone: 'Europe/Paris'
$_dateTime = new \DateTime();
$_interval5Min = new \DateInterval('PT5M');
$_dateTime->sub($_interval5Min);

$query = $this->createQueryBuilder('User')
                ->field('date_last_login')->gte($_dateTime)
                ->getQuery();
                ->execute();
看起来不错,只是日期提前了10分钟而不是5分钟?我就是不明白。如果我转储php DateTime对象,则日期正确:2011-12-23 15:35:05(15:40之前五分钟)

因此,我尝试在不缩短任何时间的情况下组合相同的查询,这一次,一切都很好:

<?php
// local time is 15:50:00
$query = $this->createQueryBuilder('User')
            ->field('date_last_login')->gte(new \DateTime())
            ->getQuery();
            ->execute();

// query is ok:
db.User.find({ "date_last_login": { "$gte": new Date("Fri, 23 Dec 2011 15:50:00 +0100") } });

这可能是由于5.3.3中修复的PHP错误造成的:


要创建查询生成器,以便在
日期\u上次登录时获取数据
超过
5分钟
有3种方法

1) 使用日期时间格式创建
DateTime
对象,从
DateTime
对象中获取
timestamp
,然后创建
MongoDate
对象:

$timeBefore5MinutesAgo  = new \DateTime(date('Y-m-d H:i:s',\time() - 5 * 60));
$mongoDateBefore5MinutesAgo = new \MongoDate($currentDateWithTime->getTimestamp());

$query = $this->createQueryBuilder('User')
    ->field('date_last_login')->gte($mongoDateBefore5MinutesAgo)
    ->getQuery();
    ->execute();
2) 创建
MongoDate
对象并使用strotime将您的datetime格式转换为
时间戳

$mongoDateBefore5MinutesAgo = new \MongoDate(strtotime(date('Y-m-d H:i:s',\time() - 5 * 60)));

$query = $this->createQueryBuilder('User')
    ->field('date_last_login')->gte($mongoDateBefore5MinutesAgo)
    ->getQuery();
    ->execute();
3) 只有在
原则2 ODM
的情况下,您才可以使用'r DateTime格式创建
DateTime
对象:

$timeBefore5MinutesAgo  = new \DateTime(date('Y-m-d H:i:s',\time() - 5 * 60));

$query = $this->createQueryBuilder('User')
              ->field('date_last_login')->gte($timeBefore5MinutesAgo)
              ->getQuery();
              ->execute();
所有3种方式都将创建此查询:

db.User.find({ "date_last_login": { "$gte": new ISODate("2014-03-15T19:35:08+02:00") } });

非常感谢,你说得对,我的PHP版本在5.3.3之前!顺便说一句,由于这个bug只影响DateTime对象的子方法,一个简单的解决方法是直接创建正确的DateTime对象,如下所示:$\u DateTime=new\DateTime('5分钟前');
db.User.find({ "date_last_login": { "$gte": new ISODate("2014-03-15T19:35:08+02:00") } });