Во время работы над одним из моих хобби-проектов, веб-приложением для личных финансов, я начал сталкиваться со странными проблемами со временем.

Проблема заключалась в том, что часовые пояса php и данные, полученные из базы данных MySQL, не были синхронизированы, поэтому оператор if всегда оценивался как false. Дело в том, что хотя и php, и mysql по умолчанию используют UTC, MySQL хранит данные о дате/времени только с часовым поясом UTC, когда данные извлекаются из базы данных, MySQL использует сервер часовой пояс.

Итак, как решить эту проблему? Если по какой-то причине ваши настройки часового пояса php отличаются от UTC, это довольно просто, просто вызовите:

default_time_zone_set("UTC"); 
//or 
ini_set("date.timezone", "UTC")

Если вы не хотите изменять настройки из кода, просто измените файл php.ini вручную.

Чтобы установить часовой пояс MySQL по умолчанию для «извлечения», вам нужно будет изменить файл MySQL my.cnf, он обычно находится в:

  • /etc/ на Centos или
  • /etc/mysql/ на серверах Ubuntu.

Просто поместите один из этих двух в файл. Вам нужно поставить их как есть, без кавычек.

default_time_zone=+00:00 #or default_time_zone=UTC

Знайте, что если вы выберете первый вариант, он не будет учитывать переход на летнее время (зимой и летом). Это важно, если вам нужно рассчитать даты на будущее, но если вы собираетесь использовать только прошлые даты, вы можете использовать это. Если вы выберете второй вариант, вам нужно будет заранее запустить команду.

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Введите его в терминал и нажмите Enter как можно сильнее! Эта команда загружает имена строк часовых поясов в базу данных mysql. Чтобы проверить, все ли установлено, вы можете запустить следующий запрос.

SELECT @@global.time_zone

Если возвращаемое значение равно +00:00/UTC, вы прошли успешно, если возвращается SYSTEM, вы сделали что-то не так, попробуйте еще раз. И последнее, но не менее важное: не забудьте вставить свои данные в стандартный формат даты MySQL «Y-m-d H:i:s» или использовать функцию STR_TO_DATE, чтобы сообщить MySQL, что к чему.

STR_TO_DATE(?, "%d %m %Y")

Если вы хотите узнать больше о хороших практиках для приложений с несколькими часовыми поясами, прочитайте этот пост.

Получайте удовольствие, продолжайте суетиться и никогда не сдавайтесь!

Первоначально опубликовано на sasablagojevic.com.