Комментарии 8
Здесь неплохо бы смотрелся кат
+5
Здесь неплохо бы просто смотрелась ссылка на оф. документацию к MySQL
www.mysql.ru/docs/man/Date_and_time_types.html
www.mysql.ru/docs/man/Date_and_time_types.html
+3
Здесь могла бы быть ваша реклама.
0
Спасибо, именно в данный момент мне это интересно :)
0
Вот только обычно пользователи X и Y, которые находятся в разных таймзонах, работают через один веб-интерфейс, который вместе с базой находится в третьей таймзоне. И без DATETIME тут уже сложно обойтись.
Еще нужно не забывать о смене на летнее/зимнее время.
Еще нужно не забывать о смене на летнее/зимнее время.
0
>> Вот только обычно пользователи X и Y, которые находятся в разных таймзонах, работают через один веб-интерфейс, который вместе с базой находится в третьей таймзоне."
Похоже, вы плохо читали. Скажите, какая разница, в какой тайм-зоне находится сервер, если время хранится в UTC/GMT+0? Никакой. А веб-интерфейс тут вообще не причем, установка зоны для каждого пользователя будет происходить в базе после коннекта, в скрипты все даты/время будут приходить уже приведенные к зоне пользователя.
По поводу перехода на летнее время, все просто. Механизм определения текущего сдвига времени по локации есть в PHP из коробки, я об этом собирался написать позже. Но раз уж вы затронули тему, то:
// устанавливаем таймзону пользователя, чтобы все функции времени отдавали время правильно
date_default_timezone_set($user->getTimeZone());
// получаем объект класса DateTimeZone для зоны пользователя
$tz = new DateTimeZone($user->getTimeZone());
// получаем текущий офсет времени в секундах от UTC/GMT+0 (здесь летнее время уже учтено)
$tzOffset = $tz->getOffset(new DateTime('now', new DateTimeZone('UTC')));
// строим строку в формате, который понимает мускуль (летом для москвы +04:00, зимой — +03:00)
$sign = $tzOffset < 0? '-': '+';
$tzOffset = $sign. str_pad(floor($tzOffset / 3600), 2, '0', STR_PAD_LEFT). ':'. str_pad(floor($tzOffset % 3600 / 60), 2, '0', STR_PAD_LEFT);
// устанавливаем правильный отступ для текущего подключения (далее юзается только это подключение)
$this->db->Query('SET time_zone = "'. $tzOffset. '"');
Если у вас не PHP, то ищите механизмы перевода времени в своем языке и передавайте мускулю правильный отступ.
Похоже, вы плохо читали. Скажите, какая разница, в какой тайм-зоне находится сервер, если время хранится в UTC/GMT+0? Никакой. А веб-интерфейс тут вообще не причем, установка зоны для каждого пользователя будет происходить в базе после коннекта, в скрипты все даты/время будут приходить уже приведенные к зоне пользователя.
По поводу перехода на летнее время, все просто. Механизм определения текущего сдвига времени по локации есть в PHP из коробки, я об этом собирался написать позже. Но раз уж вы затронули тему, то:
// устанавливаем таймзону пользователя, чтобы все функции времени отдавали время правильно
date_default_timezone_set($user->getTimeZone());
// получаем объект класса DateTimeZone для зоны пользователя
$tz = new DateTimeZone($user->getTimeZone());
// получаем текущий офсет времени в секундах от UTC/GMT+0 (здесь летнее время уже учтено)
$tzOffset = $tz->getOffset(new DateTime('now', new DateTimeZone('UTC')));
// строим строку в формате, который понимает мускуль (летом для москвы +04:00, зимой — +03:00)
$sign = $tzOffset < 0? '-': '+';
$tzOffset = $sign. str_pad(floor($tzOffset / 3600), 2, '0', STR_PAD_LEFT). ':'. str_pad(floor($tzOffset % 3600 / 60), 2, '0', STR_PAD_LEFT);
// устанавливаем правильный отступ для текущего подключения (далее юзается только это подключение)
$this->db->Query('SET time_zone = "'. $tzOffset. '"');
Если у вас не PHP, то ищите механизмы перевода времени в своем языке и передавайте мускулю правильный отступ.
0
Спасибо огромное, единственная статья на эту тему (на хабре), из которой всё стало ясно.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Календарные типы данных в MySQL: особенности использования