Hvis du begrænser dig til MySQLs DATE- og DATETIME-typer, kan du stort set ignorere tidszoneproblemer i selve MySQL. Du vil undgå MySQL's TIMESTAMP-type fordi:
Hvad angår læsning/skrivning af DATETIME-værdier, får du præcis det tilbage, du har lagt ind, hvilket er godt.
Det efterlader dig med problemet med altid at sikre, at du skriver UTC-værdier til databasen.
Den bedste måde at sikre, at PHP bruger UTC, er at indstille det eksplicit i din applikation ved hjælp af date_default_timezone_set()
. Det vil sikre, at opkald som date('Y-m-d H:i:s')
vil give dig UTC-værdien. Det vil også sikre, at noget som (new \DateTime('now'))->getTimezone()
returnerer en UTC \DateTimeZone-instans.
Du skal selvfølgelig bemærke, at tingene bliver betydeligt sværere, når du gemmer dato/tidsværdier, som du tager fra brugere. I disse tilfælde skal du på en eller anden måde bestemme, hvilken tidszone brugeren befinder sig i, og håndtere konvertering til UTC, før du fortsætter med værdierne. Hvis du antager, at dine brugere har en tidszoneindstilling pr. bruger, gør du grundlæggende noget 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');