Jeśli ograniczysz się do typów MySQL DATE i DATETIME, możesz w dużej mierze zignorować problemy ze strefami czasowymi w samym MySQL. Chcesz uniknąć typu TIMESTAMP MySQL, ponieważ:
Jeśli chodzi o odczytywanie/zapisywanie wartości DATETIME, otrzymasz dokładnie to, co włożyłeś, co jest dobre.
To pozostawia Ci problem z zapewnieniem, że zawsze zapisujesz wartości UTC do bazy danych.
Najlepszym sposobem, aby upewnić się, że PHP używa UTC jest jawne ustawienie go w aplikacji przy użyciu date_default_timezone_set()
. To zapewni, że wywołania takie jak date('Y-m-d H:i:s')
da ci wartość UTC. Zapewni również, że coś takiego jak (new \DateTime('now'))->getTimezone()
zwróci instancję UTC \DateTimeZone.
Należy oczywiście pamiętać, że sprawy stają się znacznie trudniejsze, gdy przechowujesz wartości daty/godziny, które pobierasz od użytkowników. W takich przypadkach musisz w jakiś sposób określić, w jakiej strefie czasowej znajduje się użytkownik, i obsłużyć konwersję na UTC przed utrwaleniem wartości. Zakładając, że Twoi użytkownicy mają pewne ustawienia strefy czasowej na użytkownika, zasadniczo robisz coś takiego:
/** @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');