Php Datetime出现逻辑错误->;在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

我有一个Symfony实体
设备()
。这个实体代表一个设备。。。它有以天为单位的控制和控制期(例如,每个控制需要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,所以谢谢你的课;))