Skip to content

Instantly share code, notes, and snippets.

@romaricdrigon
Last active March 21, 2019 15:12
Show Gist options
  • Save romaricdrigon/e1e7ce4f3415c8541a691cc75a52d747 to your computer and use it in GitHub Desktop.
Save romaricdrigon/e1e7ce4f3415c8541a691cc75a52d747 to your computer and use it in GitHub Desktop.
Example d'entité stockant une date avec timezone
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class Event
{
// ...
/**
* @ORM\Column(type="datetime_immutable")
*/
private $datetime;
/**
* @ORM\Column(type="string")
*/
private $timezone;
// Note: je préfère toujours utiliser que des DateTimeImmutables dans mes entités,
// pour éviter que les DateTimes ne soient modifiées dans tous les sens grâce aux références.
public function setDateTime(\DateTimeImmutable $dateTime): self
{
// On convertit et stocke tout en UTC
$dateTimeUtc = $dateTime->setTimezone(new \DateTimeZone('UTC'));
$this->datetime = $dateTimeUtc;
$this->timezone = $dateTime->getTimezone()->getName();
}
public function getDateTime(): \DateTimeImmutable
{
// Attention: $this->datetime est dans le timezone du serveur (ie., de php.ini).
// On doit repasser par la valeur "brute" (par exemple un timestamp) pour reconvertir.
$timestampUtc = $this->datetime->getTimestamp();
return \DateTimeImmutable::create('@'.$timestampUtc, new \DateTimeZone($this->timezone));
}
// Pas besoin de getter/setter sur $timezone, c'est même déconseillé
// ...
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment