Als u zich beperkt tot MySQL's DATE- en DATETIME-typen, kunt u problemen met de tijdzone grotendeels negeren in MySQL zelf. U wilt het TIMESTAMP-type van MySQL vermijden omdat:
Wat betreft het lezen/schrijven van DATETIME-waarden, je krijgt precies terug wat je hebt ingevoerd, wat goed is.
Dat geeft je het probleem om er altijd voor te zorgen dat je UTC-waarden naar de database schrijft.
De beste manier om ervoor te zorgen dat PHP UTC gebruikt, is door dit expliciet in uw toepassing in te stellen met date_default_timezone_set()
. Dat zorgt ervoor dat aanroepen als date('Y-m-d H:i:s')
geeft u de UTC-waarde. Het zorgt er ook voor dat iets als (new \DateTime('now'))->getTimezone()
zal een UTC \DateTimeZone-instantie retourneren.
Houd er natuurlijk rekening mee dat het aanzienlijk moeilijker wordt als u datum-/tijdwaarden opslaat die u van gebruikers overneemt. In die gevallen moet u op de een of andere manier bepalen in welke tijdzone de gebruiker zich bevindt en de conversie naar UTC afhandelen voordat u de waarden behoudt. Ervan uitgaande dat uw gebruikers een tijdzone-instelling per gebruiker hebben, doet u in feite zoiets als:
/** @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');