Как сохранить дату и время в MySQL с информацией о часовом поясе

У меня есть тысячи фотографий, которые были сделаны в Танзании, и я хочу сохранить дату и время, каждая фотография была сделана в базе данных MySQL. Сервер, однако, расположен в США, и я сталкиваюсь с проблемами, когда я пытаюсь сохранить танзанийскую дату и время, которая находится в пределах "недопустимого" часа в течение пружинного Летнего времени (в США). Танзания не делает DST, таким образом, время является на самом деле допустимым временем.

Дополнительные сложности - то, что существуют сотрудники от многих различных часовых поясов, которые должны будут получить доступ к значениям даты и времени, сохраненным в базе данных. Я хочу, чтобы они всегда вышли как танзанийское время а не в местное время, в котором находится различный сотрудник.

Я отказываюсь установить времена сессии, потому что я знаю, что будут проблемы, когда кто-то когда-то забудет назначать время сессии и выводит времена неправильно. И у меня нет полномочий для изменения чего-либо о сервере.

Я читал: Летнее время и лучшие практики часового пояса и поля даты и времени MySQL и летнее время - как я ссылаюсь на "дополнительный" час? и Хранение даты и времени как UTC в PHP/MySQL

Но ни один из них, кажется, не решает мою конкретную проблему. Я не эксперт SQL; существует ли способ указать часовой пояс когда установка DATETIMEs? Я не видел тот. Иначе любые предложения о том, как приблизиться к этой проблеме, значительно ценятся.

Править: Вот пример проблемы, с которой я сталкиваюсь. Я отправляю команду:

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'

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

59
задан 23 May 2017 в 15:02

2 ответа

MySQL хранит ДАТУ И ВРЕМЯ без информация о часовом поясе. Скажем, Вы храните '01.01.2019 20:00:00' в поле DATETIME при получении того значения, Вы , ожидал знать , какому часовому поясу оно принадлежит.

Так в Вашем случае при хранении значения в поле DATETIME удостоверьтесь, что это - время Танзании. Затем при выводе его это будет время Танзании. Yay!

Теперь, волосатый вопрос: Когда я делаю ВСТАВЛЕНИЕ/ОБНОВЛЕНИЕ, как я удостоверяюсь, что значение время Танзания? Два случая:

  1. Вы делаете INSERT INTO table (dateCreated) VALUES (CURRENT_TIMESTAMP or NOW()).

  2. Вы делаете INSERT INTO table (dateCreated) VALUES (?) и указываете текущее время из своего кода приложения.

MySQL СЛУЧАЯ № 1

займет текущее время, скажем, который является '01.01.2019 20:00:00' время Танзании. Затем MySQL будет преобразовывать его в UTC, который выходит к '01.01.2019 17:00:00' и хранилищу что значение в поле.

Поэтому, как Вы получаете время Танзании, которое является '20:00:00', для хранения в поле? Это не возможно. Ваш код должен будет ожидать время UTC при чтении из этого поля.

СЛУЧАЙ № 2

Это зависит от того, какое значение Вы передаете как ?. Если Вы передаете строку '01.01.2019 20:00:00', то хороший для Вас, это точно, что будет сохранено к DB. Если Вы передадите объект Даты некоторого вида, то он будет зависеть от , как драйвер дб интерпретирует тот объект Даты , и окончательный, что 'YYYY-MM-DD HH:mm:ss' строка он предоставляет MySQL для устройства хранения данных. Документация драйвера дб должна сказать Вам.

4
ответ дан 1 November 2019 в 12:51

Я когда-то также столкнулся с такой проблемой, где я должен был сохранить данные, которые использовались различными сотрудниками, и я закончил тем, что хранил время в форме метки времени Unix, которая представляет число секунд с января 1970, который является целочисленным форматом. Сегодняшняя дата и время примера в Танзании Friday, September 13, 2019 9:44:01 PM, который, когда хранилище в метке времени Unix было бы 1568400241

Теперь при чтении данных просто, используют что-то как php или любой другой язык и извлекают дату из метки времени Unix. Пример с php будет

echo date('m/d/Y', 1568400241);

, Это помогает даже хранить данные с другими сотрудниками в различных местоположениях. Они могут просто преобразовать дату в метку времени Unix с их собственным смещением по Гринвичу и сохранить его в целочисленном формате и когда вывод этого просто преобразовывает с

0
ответ дан 1 November 2019 в 12:51

Другие вопросы по тегам:

Похожие вопросы: