Wenn Sie sich auf die MySQL-Typen DATE und DATETIME beschränken, können Sie Zeitzonenprobleme in MySQL selbst weitgehend ignorieren. Sie möchten den TIMESTAMP-Typ von MySQL vermeiden, weil:
Was das Lesen/Schreiben von DATETIME-Werten betrifft, erhalten Sie genau das zurück, was Sie eingegeben haben, was gut ist.
Damit haben Sie das Problem, immer sicherzustellen, dass Sie UTC-Werte in die Datenbank schreiben.
Der beste Weg, um sicherzustellen, dass PHP UTC verwendet, besteht darin, es explizit in Ihrer Anwendung festzulegen, indem Sie date_default_timezone_set()
. Dadurch wird sichergestellt, dass Aufrufe wie date('Y-m-d H:i:s')
gibt Ihnen den UTC-Wert. Außerdem wird sichergestellt, dass so etwas wie (new \DateTime('now'))->getTimezone()
gibt eine UTC \DateTimeZone-Instanz zurück.
Sie sollten natürlich beachten, dass die Dinge erheblich schwieriger werden, wenn Sie Datums-/Uhrzeitwerte speichern, die Sie von Benutzern übernehmen. In diesen Fällen müssen Sie irgendwie bestimmen, in welcher Zeitzone sich der Benutzer befindet, und die Konvertierung in UTC vornehmen, bevor Sie die Werte beibehalten. Angenommen, Ihre Benutzer haben eine benutzerspezifische Zeitzoneneinstellung, machen Sie im Grunde so etwas wie:
/** @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');