2. Некоторые страны переходят на летнее время и обратно( Карта стран, переходящих на летнее время ).
Многие люди решают эти проблемы по-разному.
Некоторые люди сдвигают дату в запросах SQL, другие — в PHP. Некоторые люди хранят даты в TIMESTAMP, другие в DATETIME. Перерыл много источников, но нигде не нашел правильного решения этой проблемы на русском языке.
В собственной документации MySQL я нашел информацию о том, как добиться правильного автоматического преобразования TIMESTAMP в местное время, но и здесь есть свои подводные камни.
Если в php настроить часовой пояс легко, то в mysql возникают трудности, особенно если доступ к серверу mysql у вас ограничен и некоторые таблицы там еще не установлены.
Надеюсь, вы знаете, в чем разница между форматами хранения дат TIMESTAMP и DATETIME. Значение TIMESTAMP — это абсолютное значение времени, не зависящее от локальных настроек.
В любой стране, на любом компьютере одно и то же.
Поэтому в большинстве случаев дату лучше хранить в TIMESTAMP.
Если вы сделаете запрос SELECT `timestamp_field` FROM table
вы получите дату в формате «гггг-мм-дд чч:мм:сс».
Казалось бы, все просто.
А эта простота слишком заманчива и именно из-за нее могут возникнуть проблемы, ведь нужно указать, в каком часовом поясе находится пользователь, для которого получается дата.
И решение есть: можно задать зону запросом SET time_zone='+03:00'
где «+03:00» — это текущая дата, смещенная от нулевого времени Лондона.
Но после этого запроса mysql начинает некорректно обрабатывать летнее время.
Если для параметра time_zone установлено значение SYSTEM (по умолчанию), летнее время обрабатывается правильно.
Например, сейчас лето и действует летнее время.
Нам нужно преобразовать хранящуюся в базе данных TIMESTAMP в местное время.
Его значение 946681261 (это '2000-01-01 01:01:01' по киевскому времени)
Делаем запрос: SET time_zone = 'SYSTEM';
SELECT NOW(), FROM_UNIXTIME(946681261);
Получаем результат:
СЕЙЧАС() | FROM_UNIXTIME(946681261) |
2009-09-14 16:00:40 | 2000-01-01 01:01:01 |
SET time_zone = '+03:00';
SELECT NOW(), FROM_UNIXTIME(946681261);
СЕЙЧАС() | FROM_UNIXTIME(946681261) |
2009-09-14 16:00:40 | 2000-01-01 02:01:01 |
При этом текущее время отображается корректно.
Вы можете настроить mysql по мере необходимости (хорошо, если у вас есть полный доступ к базе данных) и установить часовой пояс в формате SET time_zone = 'America/Toronto';
После этого может показаться, что все проблемы исчезнут. Но и здесь могут быть сюрпризы.
Например, в 2007 году в США, Мексике и Канаде произошли некоторые изменения в правилах перехода на летнее время.
А поскольку данные о часовых поясах вводятся в MySQL вручную, необходимо следить за актуальностью данных.
Еще хуже: например, если вы используете PHP, вам нужно убедиться, что данные о часовом поясе в MySQL совпадают с данными в PHP — а это гораздо сложнее.
Поэтому лучшим решением, если вы используете PHP, является следующее:
1. Сохраните дату в MySQL в TIMESTAMP.
2. В PHP всегда устанавливайте часовой пояс пользователя с помощью функции date_default_timezone_set()
3. Получите значение TIMESTAMP из базы данных и преобразуйте его в нужный формат на PHP с помощью функции date($format, $timestamp);
По крайней мере, пока 2038 можете быть уверены, что не возникнет путаницы с датами.
Обновлять: перенесен в блог MySQL Теги: #MySQL #php #time_zone #date #datetime #timestamp #MySQL
-
Погружение В Async-Await В Android
19 Dec, 24 -
Как Не Пропустить Лучшие Продажи
19 Dec, 24 -
Летучая Мышь 3.98.1
19 Dec, 24