首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改DateTimeImmuable?

如何修改DateTimeImmuable?
EN

Stack Overflow用户
提问于 2021-10-09 10:30:17
回答 1查看 1.4K关注 0票数 0

我在使用Symfony的项目中使用DateTimeImmutable时遇到了问题。我想在不改变第一次约会的情况下给一个日期加21天。但我有个错误:

代码语言:javascript
复制
DateTimeImmutable::__construct(): Argument #1 ($datetime) must be of type string, DateTime given

我试图将dateTime更改为string (我的尝试在下面代码中的注释中)。

代码语言:javascript
复制
// My class Borrowing

namespace App\Entity;

use App\Entity\User;
use App\Entity\BorrowingDetails;
use Doctrine\ORM\Mapping as ORM;
use App\Repository\BorrowingRepository;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass=BorrowingRepository::class)
 */
class Borrowing
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="datetime")
     */
    private $dateStartBorrowing;

    /**
     * @ORM\Column(type="datetime")
     */
    private $dateLimitReturn;


    public function getId(): ?int
    {
        return $this->id;
    }

    public function getDateStartBorrowing(): ?\DateTimeInterface
    {
        return $this->dateStartBorrowing;
    }

    public function setDateStartBorrowing(\DateTimeInterface $dateStartBorrowing): self
    {
        $this->dateStartBorrowing = $dateStartBorrowing;

        return $this;
    }

    /**
     * @return Collection|BorrowingDetails[]
     */
    public function getBorrowingDetails(): Collection
    {
        return $this->borrowingDetails;
    }

    public function addBorrowingDetail(BorrowingDetails $borrowingDetail): self
    {
        if (!$this->borrowingDetails->contains($borrowingDetail)) {
            $this->borrowingDetails[] = $borrowingDetail;
            $borrowingDetail->setMyBorrowing($this);
        }

        return $this;
    }

    public function getDateLimitReturn(): ?\DateTimeInterface
    {
        return $this->dateLimitReturn;
    }

    public function setDateLimitReturn(\DateTimeInterface $dateLimitReturn): self
    {
        $this->dateStartBorrowing = $dateLimitReturn;

        return $this;
    }

    // I tried to add this function
    // public function __toString() {
    //     return $this->getDateStartBorrowing();
    // }
}
代码语言:javascript
复制
// This is my BorrowingController

$dateStartBorrowing = new \DateTime();
// I Tried : $dateStartBorrowing->format('Y-m-d H:i:s');

$dateLimitReturn = new \DateTimeImmutable($dateStartBorrowing);
$dateLimitReturn->modify('+21 days');
$dateLimitReturn->format('Y-m-d H:i:s');
            
$borrowing = new Borrowing();
$borrowing->setDateStartBorrowing($dateStartBorrowing);
$borrowing->setDateLimitReturn($dateLimitReturn);    

有人有答案吗?

如果我设法将其转换为字符串,那么我的其余代码是否会工作,因为在我的数据库中,它必须是一个日期时间吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-09 12:31:11

\DateTimeImmutable不修改原始对象,而是为您提供一个新对象

代码语言:javascript
复制
$today = new \DateTimeImmutable('now');
$inTenDays = $today->modify('+10 days'); 
dump($today); // is still 'now'
dump($inTenDays); // 10 days in future

因此有两种选择:

  1. 存储在一个新变量
  2. 中更改--在这个特殊情况下不要使用\DateTimeImmutable --

1)

代码语言:javascript
复制
$dateStartBorrowing = new \DateTime(); // which is now

$dateLimitReturn = \DateTimeImmutable::createFromMutable($dateStartBorrowing); // now it's an instance of DateTimeImmutable 
$modified = $dateLimitReturn->modify('+21 days');
...
$borrowing->setDateLimitReturn($modified);

For2)

代码语言:javascript
复制
$dateLimitReturn = clone $dateStartBorrowing; // you need a copy so you can modify $dateLimitReturn whithout changing the $dateStartBorrowing
$dateLimitReturn->modify('+21 days'); // $dateLimitReturn is now modified and 21 days in future
...
$borrowing->setDateLimitReturn($dateLimitReturn);

你也可以做得更短..。

代码语言:javascript
复制
$inTwentyOneDays = new \DateTimeImmutable('now + 21 days');
$borrowing->setDateLimitReturn($inTwentyOneDays);

更新:

TBH,我不知道您的业务逻辑,但在本例中,我看不到在常规\DateTime中使用\DateTimeImmutable的任何好处。

为什么?

由于实体的属性声明是:@ORM\Column(type="datetime") (从数据库读取后),所以所有$ entity ->getDateLimitRe转折点()都是常规\DateTime anyway...unless,您有一些自定义原则类型

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69505902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档