获取与学说的日期时间差异
Get datetime difference with doctrine
您好,我正在尝试提供天数并获取从那天到现在的记录。
$now = new \DateTime();
$days = 14;
$to = $now->sub(new \DateInterval('P'.$days.'D'));
$qb = $this->createQueryBuilder('c')
$qb->andWhere('c.createdDate BETWEEN :from AND :to')
->setParameter('from', $now)
->setParameter('to', $to);
$qb->getQuery()->getResult();
在我的数据库 created_date 列中有一条包含 2018-12-12 的记录。但不幸的是,查询 returns 没有值:(。如果有人能解决,那将是很大的帮助。我正在使用 sub 来获取负日期。
有效查询是:
$from = new \DateTime('-14 days');
$to = (new \DateTime())->setTime(23, 59, 59);
$qb = $this->createQueryBuilder('c')
$qb->andWhere('c.createdDate BETWEEN :from AND :to')
->setParameter('from', $from)
->setParameter('to', $to);
$result = $qb->getQuery()->getResult();
它对您不起作用的原因是 \DateTime
是可变类型。通过更改副本,您还更改了之前的日期对象:
$from = new \DateTime();
// below you mutate the $from object, then return its instance
$to = $from->sub(new \DateInterval('P10D'));
// effect is both $from and $to reference the same object in memory
var_dump(spl_object_hash($from) === spl_object_hash($to));
echo $from->format('Y-m-d') , '<br>';
echo $to->format('Y-m-d');
将导致:
bool(true)
2018-12-07
2018-12-07
您在 Doctrine 中将 属性 createdDate
映射为 datetime
。我个人总是使用 datetime_immutable
类型。我开始使用 DateTimeImmutable 而不是 DateTime,与 DateTime 相比,它在设计上是不可变的,因此我不必担心任何引用:
$from = new \DateTimeImmutable();
$to = $from->sub(new \DateInterval('P10D'));
var_dump(spl_object_hash($from) === spl_object_hash($to));
echo $from->format('Y-m-d') , '<br>';
echo $to->format('Y-m-d');
结果:
bool(false)
2018-12-17
2018-12-07
您好,我正在尝试提供天数并获取从那天到现在的记录。
$now = new \DateTime();
$days = 14;
$to = $now->sub(new \DateInterval('P'.$days.'D'));
$qb = $this->createQueryBuilder('c')
$qb->andWhere('c.createdDate BETWEEN :from AND :to')
->setParameter('from', $now)
->setParameter('to', $to);
$qb->getQuery()->getResult();
在我的数据库 created_date 列中有一条包含 2018-12-12 的记录。但不幸的是,查询 returns 没有值:(。如果有人能解决,那将是很大的帮助。我正在使用 sub 来获取负日期。
有效查询是:
$from = new \DateTime('-14 days');
$to = (new \DateTime())->setTime(23, 59, 59);
$qb = $this->createQueryBuilder('c')
$qb->andWhere('c.createdDate BETWEEN :from AND :to')
->setParameter('from', $from)
->setParameter('to', $to);
$result = $qb->getQuery()->getResult();
它对您不起作用的原因是 \DateTime
是可变类型。通过更改副本,您还更改了之前的日期对象:
$from = new \DateTime();
// below you mutate the $from object, then return its instance
$to = $from->sub(new \DateInterval('P10D'));
// effect is both $from and $to reference the same object in memory
var_dump(spl_object_hash($from) === spl_object_hash($to));
echo $from->format('Y-m-d') , '<br>';
echo $to->format('Y-m-d');
将导致:
bool(true)
2018-12-07
2018-12-07
您在 Doctrine 中将 属性 createdDate
映射为 datetime
。我个人总是使用 datetime_immutable
类型。我开始使用 DateTimeImmutable 而不是 DateTime,与 DateTime 相比,它在设计上是不可变的,因此我不必担心任何引用:
$from = new \DateTimeImmutable();
$to = $from->sub(new \DateInterval('P10D'));
var_dump(spl_object_hash($from) === spl_object_hash($to));
echo $from->format('Y-m-d') , '<br>';
echo $to->format('Y-m-d');
结果:
bool(false)
2018-12-17
2018-12-07