Задавайте вопросы, мы ответим
Вы не зашли.
Доброго дня, Коллеги!
Поможите идеями плиз.
Есть сервер убунтовый, находится в Берлине, на нем MySQL
#less /etc/timezone Europe/Berlin
mysql> select version(); +-------------------------+ | version() | +-------------------------+ | 5.6.31-0ubuntu0.15.10.1 | +-------------------------+ 1 row in set (0.00 sec)
Timezone вроде системная
mysql> SELECT @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 1 row in set (0.00 sec)
системное время, полученное командой date, совпало с временем тут.
UTC+2.
Нужно поработать с timestamp, тут-то беды и начались.
Вроде все примитивно.
mysql> CREATE TABLE `test` (`block_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00') ENGINE=InnoDB; Query OK, 0 rows affected (0.00 sec) mysql> insert into test values(from_unixtime(1231469744)); Query OK, 1 row affected (0.00 sec) mysql> SELECT CONVERT_TZ(`block_time`, @@session.time_zone, '+00:00') AS `utc_datetime` FROM `test`; +---------------------+ | utc_datetime | +---------------------+ | 2009-01-09 02:55:44 | +---------------------+ 1 row in set (0.00 sec) mysql> select * from test; +---------------------+ | block_time | +---------------------+ | 2009-01-09 03:55:44 | +---------------------+ 1 row in set (0.00 sec)
Время, которое вставил - 1231469744, оно соответствует ( опять же проверял через http://www.epochconverter.com/ ) GMT: Fri, 09 Jan 2009 02:55:44 GMT.
Запрос
mysql> set time_zone='+02:00'; Query OK, 0 rows affected (0.00 sec) mysql> select `block_time`,CONVERT_TZ(`block_time`, @@session.time_zone, '+00:00') from test; +---------------------+---------------------------------------------------------+ | block_time | CONVERT_TZ(`block_time`, @@session.time_zone, '+00:00') | +---------------------+---------------------------------------------------------+ | 2009-01-09 04:55:44 | 2009-01-09 02:55:44 | +---------------------+---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> set time_zone='SYSTEM'; Query OK, 0 rows affected (0.00 sec) mysql> select `block_time`,CONVERT_TZ(`block_time`, @@session.time_zone, '+00:00') from test; +---------------------+---------------------------------------------------------+ | block_time | CONVERT_TZ(`block_time`, @@session.time_zone, '+00:00') | +---------------------+---------------------------------------------------------+ | 2009-01-09 03:55:44 | 2009-01-09 02:55:44 | +---------------------+---------------------------------------------------------+ 1 row in set (0.00 sec)
В общем, total: как грамотно организовать работу с базой в данном контексте?
Неактивен
Это летнее время в Берлине +2, а зимнее +1. Сейчас действительно летнее (до 30 октября), но тестируемая дата (9 января) - зимой. Не вижу особого смысла опираться на локальное время на сервере, проще работать в GMT.
Неактивен
rgbeast, спасибо за ответ!
Ты имеешь в виду прописать в my.cnf
default-time-zone = '+02:00'
и не париться, пока сервер не переедет из Берлина, в например, Лондон (а там прописать 00:00)?
Неактивен
Ух. ты. Почему-то был уверен, что перехода на летнее/зимнее время в европе нет, и когда мы в 2014 отменили такой перевод, то приобщились к "цивилизованным" странам. Емнип, что-то такое было при аргументации отказа от перевода часов.
Неактивен
Мне тоже так наивно казалось . Ан нет, рудименты бывают и в цивилизованной Европе.
Неактивен
Перевода на летнее время нет в Японии, Исландии, Индии, Китае. В Европе (кроме Исландии) и США переход есть, причем в разные дни.
Я бы прописал в my.cnf
Неактивен
Мм. Вопрос, конечно, интересный (про время местности сервера). Но в то же время - ведь обычно на серверах (по меньшей мере в ОС) указывается не UTC время, а время города, где сервера находится, например, если в Московском ДЦ сервер стоит, то там ведь таймзона прописана Europe/Moscow, разве не так? Пробежался по серверам, куда есть доступ - и везде
mysql> SELECT @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 1 row in set (0.00 sec)
Не +00:00, а именно SYSTEM, то есть из таймзоны сервера.
Или это просто дефолтная настройка, которую никому менять не нужно?
Какова "правильная" практика на этот счет, если, конечно, она есть и ее можно кратко описать?
Неактивен
Время на сервере - настройка, которую устанавливает админ. Системные часы обычно идут в UTC. Если у меня будет сервер в Германии, вряд ли поставлю берлинское время. В MySQL настройка по-умолчанию SYSTEM. Это нужно для следующего:
Пусть человек не знает, что есть разные часовые пояса, так как сервер, он и его пользователи живут в одном городе. Тогда он может не думая использовать время на сервере, которое установлено им один раз в соответствии с местом размещения. И все будет работать с дефолтными настройками. Такая ситуация может быть в локальной сети компании, размещенной в одном городе.
Для тех, кто не может игнорировать существование часовых поясов, дефолтные настройки будут только обузой. Пример - данная тема, которая показывает, что локальное время в Берлине не всегда понятно разработчику. Удобнее хранить время в базе в UTC. Для пользователей, расположенных в разных временных зонах, это время все равно придется конвертировать (немецкое их не устроит).
Неактивен
Ага, спасибо, звучит весомо.
Неактивен