Php Datetime出现逻辑错误->;在Symfony实体中修改
我有一个Symfony实体Php Datetime出现逻辑错误->;在Symfony实体中修改,php,symfony,datetime,logic,entity,Php,Symfony,Datetime,Logic,Entity,我有一个Symfony实体设备()。这个实体代表一个设备。。。它有以天为单位的控制和控制期(例如,每个控制需要30天)。 控件有日期,我正在尝试显示下一个需要的控件日期 这是我的设备实体: <?php namespace StockBundle\Entity; use StockBundle\Entity\EquipmentControle; /** * Equipment * * @ORM\Table(name="stock_equipment") * @ORM\Entit
设备()
。这个实体代表一个设备。。。它有以天为单位的控制和控制期(例如,每个控制需要30天)。
控件有日期,我正在尝试显示下一个需要的控件日期
这是我的设备实体:
<?php
namespace StockBundle\Entity;
use StockBundle\Entity\EquipmentControle;
/**
* Equipment
*
* @ORM\Table(name="stock_equipment")
* @ORM\Entity(repositoryClass="StockBundle\Repository\EquipmentRepository")
*/
class Equipment
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="EquipmentControle", mappedBy="equipment")
*/
private $controles;
/**
* @var float
*
* @ORM\Column(name="control_interval", type="integer", options={"default" : 0})
*/
private $controlInterval = 0;
public function getControles()
{
return $this->controles;
}
public function getControlInterval()
{
return $this->controlInterval;
}
public function setControles($controles)
{
$this->controles = $controles;
}
public function setControlInterval($controlInterval)
{
$this->controlInterval = $controlInterval;
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
public function getLastControlDate(){
$lastControle = null;
foreach ($this->getControles() as $c){
if($lastControle == null || $c->getDate() > $lastControle->getDate()){
$lastControle = $c;
}
}
return $lastControle == null ? null : $lastControle->getDate();
}
public function getNextControlDate(){
if($this->getLastControlDate() == null && $this->getControlInterval() > 0){
return new \DateTime("NOW");
}elseif ($this->getLastControlDate() != null && $this->getControlInterval() > 0){
return $this->getLastControlDate()->modify('+'.$this->getControlInterval().'day');
}else{
return null;
}
}
}
但似乎nextControlDate总是假定日期的两倍
我的最后一个控件是2018年11月29日,下一个控件是2018年12月19日。当我尝试更改控制间隔时也是如此
当我在lastControlDate
之前显示nextControlDate
时,我得到的控件lastControl和nextControl的日期相同
需要帮忙吗 使用Datetime的不可变版本,这样您就可以多次使用它,而无需从上次修改中重新计算
if ($this->getLastControlDate() != null && $this->getControlInterval() > 0){
$dateImmuable = new \DateTimeImmutable();
$dateImmuable->createFromMutable($this->getLastControlDate());
return $dateImmuable->modify('+'.$this->getControlInterval().'day');
}
使用Datetime的不可变版本,以便可以多次使用它,而无需从上次修改重新计算
if ($this->getLastControlDate() != null && $this->getControlInterval() > 0){
$dateImmuable = new \DateTimeImmutable();
$dateImmuable->createFromMutable($this->getLastControlDate());
return $dateImmuable->modify('+'.$this->getControlInterval().'day');
}
这是因为您正在修改DateTime对象的同一个实例。看看PHP文档中的引用:尝试将DateTime对象更改为DateTimeImmutable,或者在修改itI之前克隆该对象。我知道,但下一个控件是在最后一个控件日期函数之后执行的。所以这不是问题所在。即使你是对的,使用datetimeImmuable将允许我以任何顺序使用函数。。。真正的问题是我的nextControlDate是它应该的两倍。如果您将
DateTime
更改为DateTimeImmutable
,它将开始工作,您将看到:)为什么间隔增加了两次?因为您要调用方法nextControlDate
两次;)首先在细枝状态下,然后在打印实际日期时。这就是为什么如果可以的话,应该使用不可变的结构来避免这些“神秘”的问题;)哦,该死的,我明白了,非常感谢你,我明天第一件事就是试试这个,但我相信它会管用的。(我以前不知道datetimeImmuable,所以感谢您的课程;))这是因为您正在修改DateTime对象的同一个实例。看看PHP文档中的引用:尝试将DateTime对象更改为DateTimeImmutable,或者在修改itI之前克隆该对象。我知道,但下一个控件是在最后一个控件日期函数之后执行的。所以这不是问题所在。即使你是对的,使用datetimeImmuable将允许我以任何顺序使用函数。。。真正的问题是我的nextControlDate是它应该的两倍。如果您将DateTime
更改为DateTimeImmutable
,它将开始工作,您将看到:)为什么间隔增加了两次?因为您要调用方法nextControlDate
两次;)首先在细枝状态下,然后在打印实际日期时。这就是为什么如果可以的话,应该使用不可变的结构来避免这些“神秘”的问题;)哦,该死的,我明白了,非常感谢你,我明天第一件事就是试试这个,但我相信它会管用的。(我以前不知道datetimeImmuable,所以谢谢你的课;))