我在使用Symfony的项目中使用DateTimeImmutable时遇到了问题。我想在不改变第一次约会的情况下给一个日期加21天。但我有个错误:
DateTimeImmutable::__construct(): Argument #1 ($datetime) must be of type string, DateTime given我试图将dateTime更改为string (我的尝试在下面代码中的注释中)。
// 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();
// }
}// 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); 有人有答案吗?
如果我设法将其转换为字符串,那么我的其余代码是否会工作,因为在我的数据库中,它必须是一个日期时间吗?
发布于 2021-10-09 12:31:11
\DateTimeImmutable不修改原始对象,而是为您提供一个新对象。
$today = new \DateTimeImmutable('now');
$inTenDays = $today->modify('+10 days');
dump($today); // is still 'now'
dump($inTenDays); // 10 days in future因此有两种选择:
\DateTimeImmutable --1)
$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)
$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);你也可以做得更短..。
$inTwentyOneDays = new \DateTimeImmutable('now + 21 days');
$borrowing->setDateLimitReturn($inTwentyOneDays);更新:
TBH,我不知道您的业务逻辑,但在本例中,我看不到在常规\DateTime中使用\DateTimeImmutable的任何好处。
为什么?
由于实体的属性声明是:@ORM\Column(type="datetime") (从数据库读取后),所以所有$ entity ->getDateLimitRe转折点()都是常规\DateTime anyway...unless,您有一些自定义原则类型
https://stackoverflow.com/questions/69505902
复制相似问题