Si vous vous limitez aux types DATE et DATETIME de MySQL, vous pouvez largement ignorer les problèmes de fuseau horaire dans MySQL lui-même. Vous souhaitez éviter le type TIMESTAMP de MySQL car :
En ce qui concerne la lecture/écriture des valeurs DATETIME, vous récupérerez exactement ce que vous avez mis, ce qui est bien.
Cela vous laisse le problème de toujours vous assurer que vous écrivez les valeurs UTC dans la base de données.
La meilleure façon de s'assurer que PHP utilise UTC est de le définir explicitement dans votre application en utilisant date_default_timezone_set()
. Cela garantira que les appels comme date('Y-m-d H:i:s')
vous donnera la valeur UTC. Cela garantira également que quelque chose comme (new \DateTime('now'))->getTimezone()
renverra une instance UTC \DateTimeZone.
Vous devez noter, bien sûr, que les choses deviennent beaucoup plus difficiles lorsque vous stockez des valeurs de date/heure que vous prenez des utilisateurs. Dans ces cas, vous devrez déterminer d'une manière ou d'une autre le fuseau horaire dans lequel se trouve l'utilisateur et gérer la conversion en UTC avant de conserver les valeurs. En supposant que vos utilisateurs disposent d'un paramètre de fuseau horaire par utilisateur, vous faites essentiellement quelque chose comme :
/** @var \DateTimeZone $userTZ */
$userTz = getUserTimezone();
$dateTime = new \DateTime($user_submitted_date_string, $userTz);
$dateTime->setTimezone(new \DateTime('UTC'));
$dateTimeStr = $dateTime->format('Y-m-d H:i:s');