Подтвердить что ты не робот

Как хранить дату и время в 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'

Эта дата и время существуют в Танзании, но не в США, где находится база данных.

4b9b3361

Ответ 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';