SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.09.2016 21:36:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2093

Неправильная работа с timezone

Доброго дня, Коллеги!

Поможите идеями плиз.

Есть сервер убунтовый, находится в Берлине, на нем 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.
Запрос

SELECT  CONVERT_TZ(`block_time`, @@session.time_zone, '+00:00') AS `utc_datetime`  FROM `test`;

даёт тот же результат.

Но почему же тогда select * from даёт 03:55:44? Ведь таймзона +2, то есть должно было 04:55:44, разве нет?
Что-то не учтено?

UPD:

Вычитал на хабре, что если сразу после подключения задавать таймзону явным образом (чтобы не SYSTEM использовался, а конкретное смещение), то будет лучше, правда вроде есть и другие подводные камни.

Эксперимент, в принципе, подтвердил:

Код:

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 30.09.2016 22:41:36

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3766

Re: Неправильная работа с timezone

Это летнее время в Берлине +2, а зимнее +1. Сейчас действительно летнее (до 30 октября), но тестируемая дата (9  января) - зимой. Не вижу особого смысла опираться на локальное время на сервере, проще работать в GMT.

Неактивен

 

#3 30.09.2016 22:48:48

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2093

Re: Неправильная работа с timezone

rgbeast, спасибо за ответ!
Ты имеешь в виду прописать в my.cnf
default-time-zone = '+02:00'
и не париться, пока сервер не переедет из Берлина, в например, Лондон (а там прописать 00:00)?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 30.09.2016 22:52:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5269

Re: Неправильная работа с timezone

Ух. ты. Почему-то был уверен, что перехода на летнее/зимнее время в европе нет, и когда мы в 2014 отменили такой перевод, то приобщились к "цивилизованным" странам. Емнип, что-то такое было при аргументации отказа от перевода часов.

Неактивен

 

#5 30.09.2016 23:02:17

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2093

Re: Неправильная работа с timezone

Мне тоже так наивно казалось sad. Ан нет, рудименты бывают и в цивилизованной Европе.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 01.10.2016 00:14:43

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3766

Re: Неправильная работа с timezone

Перевода на летнее время нет в Японии, Исландии, Индии, Китае. В Европе (кроме Исландии) и США переход есть, причем в разные дни.
Я бы прописал в my.cnf

default-time-zone = '+00:00'


Какой смысл для твоих проектов имеет время местности, где размешен сервер?

Неактивен

 

#7 01.10.2016 00:24:21

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2093

Re: Неправильная работа с timezone

Мм. Вопрос, конечно, интересный (про время местности сервера).  Но в то же время - ведь обычно на серверах (по меньшей мере в ОС) указывается не 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, то есть из таймзоны сервера.
Или это просто дефолтная настройка, которую никому менять не нужно?
Какова "правильная" практика на этот счет, если, конечно, она есть и ее можно кратко описать?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 01.10.2016 17:25:24

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3766

Re: Неправильная работа с timezone

Время на сервере - настройка, которую устанавливает админ. Системные часы обычно идут в UTC. Если у меня будет сервер в Германии, вряд ли поставлю берлинское время. В MySQL настройка по-умолчанию SYSTEM. Это нужно для следующего:

Пусть человек не знает, что есть разные часовые пояса, так как сервер, он и его пользователи живут в одном городе. Тогда он может не думая использовать время на сервере, которое установлено им один раз в соответствии с местом размещения. И все будет работать с дефолтными настройками. Такая ситуация может быть в локальной сети компании, размещенной в одном городе.

Для тех, кто не может игнорировать существование часовых поясов, дефолтные настройки будут только обузой. Пример - данная тема, которая показывает, что локальное время в Берлине не всегда понятно разработчику. Удобнее хранить время в базе в UTC. Для пользователей, расположенных в разных временных зонах, это время все равно придется конвертировать (немецкое их не устроит).

Неактивен

 

#9 01.10.2016 22:20:42

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2093

Re: Неправильная работа с timezone

Ага, спасибо, звучит весомо.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson