Как хранить дату и время в MySQL с информацией о часовом поясе
У меня есть тысячи фотографий, которые были сделаны в Танзании, и я хочу сохранить дату и время, когда каждая фотография была сделана в базе данных MySQL. Однако сервер находится в США, и я сталкиваюсь с проблемами, когда пытаюсь сохранить танзанийскую дату-время, которая попадает в "недействительный" час во время spring летнего времени (в США). Танзания не делает DST, поэтому время - действительно действительное время.
Дополнительные осложнения заключаются в том, что есть соавторы из многих разных часовых поясов, которым потребуется доступ к значениям даты и времени, хранящимся в базе данных. Я хочу, чтобы они всегда выходили как танзанийское время, а не в местное время, в котором участвует другой соавтор.
Я не хочу устанавливать время сеанса, потому что я знаю, что будут проблемы, когда кто-то когда-нибудь забудет установить время сеанса и получает время от ошибок. И у меня нет полномочий изменять что-либо о сервере.
Я читал:
Лучшее использование летнего времени и часовых поясов и
MySQL datetime fields и летнее время - как я могу ссылаться на" extra " час? и
Хранение datetime как UTC в PHP/MySQL
Но ни одна из них, похоже, не касается моей конкретной проблемы. Я не эксперт по SQL; есть ли способ указать часовой пояс при настройке DATETIME? Я его не видел. В противном случае, любые предложения о том, как подойти к этой проблеме, очень ценятся.
Изменить:
Вот пример проблемы, с которой я сталкиваюсь. Я посылаю команду:
INSERT INTO Images (CaptureEvent, SequenceNum, PathFilename, TimestampJPG)
VALUES (122,1,"S2/B04/B04_R1/IMAG0148.JPG","2011-03-13 02:49:10")
И я получаю сообщение об ошибке:
Error 1292: Incorrect datetime value: '2011-03-13 02:49:10' for column 'TimestampJPG'
Эта дата и время существуют в Танзании, но не в США, где находится база данных.
Ответы
Ответ 1
Ты сказал:
Я хочу, чтобы они всегда выходили как танзанийское время, а не в то местное время, в котором участвует другой соавтор.
Если это так, то вы не должны использовать UTC. Все, что вам нужно сделать, это использовать тип DATETIME
в MySQL вместо типа TIMESTAMP
.
Из документации MySQL:
MySQL преобразует значения TIMESTAMP
из текущего часового пояса в UTC для хранения и обратно из UTC в текущий часовой пояс для извлечения. (Это не происходит для других типов, таких как DATETIME
.)
Если вы уже используете тип DATETIME
, вы не должны устанавливать его по местному времени для начала. Вам нужно больше сосредоточиться на базе данных и больше на вашем коде приложения, который вы здесь не показывали. Проблема и решение будут сильно различаться в зависимости от языка, поэтому обязательно отметьте вопрос на соответствующем языке вашего кода приложения.
Ответ 2
Все описанные вами симптомы подсказывают, что вы никогда не говорите MySQL о том, какой часовой пояс использовать, поэтому он по умолчанию относится к системной зоне. Подумайте об этом: если все, что у него есть, есть '2011-03-13 02:49:10'
, как он может предположить, что это местная танзанийская дата?
Насколько я знаю, MySQL не предоставляет никакого синтаксиса для указания информации о часовом поясе в датах. Вы должны изменить его для каждого соединения; что-то вроде:
SET time_zone = 'EAT';
Если это не работает (для использования названных зон вам нужно, чтобы сервер был настроен, чтобы это сделать, и это часто не так), вы можете просто использовать Смещения UTC:
SET time_zone = '+03:00';