Om du begränsar dig till MySQLs DATE- och DATETIME-typer kan du i stort sett ignorera tidszonsproblem i själva MySQL. Du vill undvika MySQL:s TIMESTAMP-typ eftersom:
När det gäller att läsa/skriva DATETIME-värden så får du tillbaka exakt vad du lagt in, vilket är bra.
Det lämnar dig med problemet att alltid se till att du skriver UTC-värden till databasen.
Det bästa sättet att säkerställa att PHP använder UTC är att uttryckligen ställa in det i din applikation med date_default_timezone_set()
. Det säkerställer att anrop som date('Y-m-d H:i:s')
ger dig UTC-värdet. Det kommer också att säkerställa att något som (new \DateTime('now'))->getTimezone()
returnerar en UTC \DateTimeZone-instans.
Du bör förstås notera att saker och ting blir betydligt svårare när du lagrar datum/tidsvärden som du tar från användare. I dessa fall måste du på något sätt bestämma vilken tidszon användaren befinner sig i och hantera konverteringen till UTC innan du behåller värdena. Förutsatt att dina användare har någon tidszonsinställning per användare, gör du i princip något som:
/** @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');