Ако се ограничите до типовете DATE и DATETIME на MySQL, можете до голяма степен да игнорирате проблемите с часовата зона в самия MySQL. Искате да избегнете типа TIMESTAMP на MySQL, защото:
Що се отнася до четенето/записването на стойности DATETIME, ще получите обратно точно това, което сте въвели, което е добре.
Това ви оставя с проблема винаги да гарантирате, че записвате UTC стойности в базата данни.
Най-добрият начин да се уверите, че PHP използва UTC, е изрично да го зададете в приложението си с помощта на date_default_timezone_set()
. Това ще гарантира, че извиквания като date('Y-m-d H:i:s')
ще ви даде UTC стойността. Освен това ще гарантира, че нещо като (new \DateTime('now'))->getTimezone()
ще върне екземпляр UTC \DateTimeZone.
Трябва да отбележите, разбира се, че нещата стават значително по-трудни, когато съхранявате стойности за дата/час, които вземате от потребителите. В тези случаи ще трябва по някакъв начин да определите в коя часова зона е потребителят и да обработите преобразуването в UTC, преди да запазите стойностите. Ако приемем, че вашите потребители имат някаква настройка за часова зона за всеки потребител, вие основно правите нещо като:
/** @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');