Вот как с этим справиться.
- Объявите столбцы
dateOut
и dateIn
как TIMESTAMP
типы данных в вашей таблице.
- Когда вы предоставляете значения даты / времени для ваших
insert
запросов, используйте текстовые строки в таких форматах, как 2019-04-08 16:52
. Или используйте объекты Date в Javascript.
- При регистрации своих пользователей, спросите их предпочтения часового пояса, в частности попросив их выбрать одно из значений в
mysql.time_zone_name.name
.
- Сохраните это предпочтение в виде строки (например,
Asia/Kolkata
или America/Halifax
) в таблице пользовательских настроек. VARCHAR(63)
- хороший выбор типа данных для этого столбца.
- Каждый раз, когда вы используете соединение MySQL в своем приложении от имени пользователя, сначала введите команду
SET time_zone = whateverTheyChose
, чтобы установить предпочтительный часовой пояс пользователя.
Почему это хорошо? TIMESTAMP
Значения типа данных всегда сохраняются в UTC и всегда переводятся в / из текущего установленного часового пояса при их получении или сохранении.
Если вы хотите вставить текущее значение даты / времени в столбец, вы можете сделать что-то вроде этого:
insert into Orders
(dateOut, dateIn, location, success)
values (NOW(), NOW(), ?, ?)
Обратите внимание, как значения и заполнители в предложении values()
соответствуют один к одному с элементами в списке столбцов.
Вы можете прочитать о системе обработки часовых поясов MySQL на 'toobz . Он основан на базе данных IANA zoneinfo . Хранители этой базы данных позаботятся обо всех странных временных проблемах, таких как, когда дневное время начинается и заканчивается в Туркменистане или Индиане, США, так что остальным из нас это не нужно.
Если вы используете DATE
или DATETIME
типы данных вместо TIMESTAMP
, вы не получите этот автоматический материал о часовых поясах. Эти типы данных более или менее похожи на фотографии часов.
Независимо от того, какой тип данных вы используете, вы можете использовать функцию MySQL с именем TIMESTAMPDIFF () для вычисления длительностей. Например,
TIMESTAMPDIFF(HOUR, dateOut, dateIn)
сообщает количество часов между двумя значениями даты и времени. Он будет работать правильно, даже если ваши два значения охватывают дни переключения на летнее время.
Стоит потратить много времени на изучение того, как ваша база данных обрабатывает даты и время. Они делают это очень хорошо, поэтому вам не нужно заново изобретать спущенное колесо.
И стоит потрудиться, чтобы все это правильно настроить очень рано в жизни вашего приложения. Очень очень трудно изменить работающую систему для обработки этих часовых поясов. (Не спрашивайте, откуда я знаю, что это сложно!)