Поле datetimetz
Поле datetimetz относится к типу Doctrine
datetimetz и хранит дату, время и часовой
пояс. В PHP такое значение представляется объектом
DateTime. В отличие от поля datetime,
которое сохраняет момент времени без привязки к зоне,
datetimetz запоминает ещё и саму зону, в которой
это время было указано.
При извлечении из базы данных Doctrine восстанавливает
объект DateTime вместе с его часовым поясом.
Поэтому поле удобно использовать, когда важно знать,
в какой зоне было зафиксировано событие.
Синтаксис
#[ORM\Column(type: 'datetimetz')]
private DateTime $createdAt;
Пример
Давайте создадим сущность с полем datetimetz:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use DateTime;
#[ORM\Entity]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private int $id;
#[ORM\Column(type: 'string')]
private string $title;
#[ORM\Column(type: 'datetimetz')]
private DateTime $createdAt;
public function getCreatedAt(): DateTime
{
return $this->createdAt;
}
public function setCreatedAt(DateTime $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
}
?>
Пример
Давайте создадим объект с определённым часовым поясом:
<?php
use App\Entity\Article;
use DateTime;
use DateTimeZone;
$article = new Article();
$article->setCreatedAt(
new DateTime('2024-01-01 12:00:00', new DateTimeZone('Europe/Moscow'))
);
echo $article->getCreatedAt()->format('Y-m-d H:i:s e');
?>
Результат выполнения кода:
"2024-01-01 12:00:00 Europe/Moscow"
Пример
Давайте посмотрим, как Doctrine восстанавливает часовой пояс после сохранения и чтения из базы данных:
<?php
use App\Entity\Article;
use DateTime;
use DateTimeZone;
$article = new Article();
$article->setCreatedAt(
new DateTime('2024-01-01 12:00:00', new DateTimeZone('Europe/Moscow'))
);
$entityManager->persist($article);
$entityManager->flush();
$id = $article->getId();
$entityManager->clear();
$res = $entityManager->find(Article::class, $id);
echo $res->getCreatedAt()->getTimezone()->getName();
?>
Результат выполнения кода:
"Europe/Moscow"
Как видим, часовой пояс Europe/Moscow сохранился
вместе со значением даты и времени.
Смотрите также
-
поле
datetime,
которое хранит дату и время без часового пояса -
поле
datetimetz_immutable,
которое хранит неизменяемую дату и время с часовым поясом -
поле
date,
которое хранит только дату -
поле
time,
которое хранит только время