2017-02-08 2 views
0

Я думал, что если вы передали MySQL временную метку Epoch (как длинную) и использовали FROM_UNIXTIME(), чтобы получить ее как сопоставимую дату, что часовой пояс сервера не имеет значения. Но он (по крайней мере, в нашей настройке) нуждается в конкретной конфигурации?).Почему часовой пояс сервера влияет на чтение MySQL периодов FROM_UNIXTIME?

Использование MySQL Version: MySQL Ver 14,14 DISTRIB 5.5.48-37.8 для Linux (x86_64) с помощью Readline 5.1

я начинаю с моего сервера, установленного в UTC.

При запуске запроса, такие как:

SELECT COUNT(*) FROM Orders 
WHERE startTime BETWEEN FROM_UNIXTIME(1486509895) AND FROM_UNIXTIME(1486596296); 

Я получаю 127 заказов.

затем переключить свой часовой пояс, чтобы быть EST:

sudo mv /etc/localtime /etc/localtime.bak 
sudo ln -s /usr/share/zoneinfo/America/New_York /etc/localtime 
sudo service mysql3306 restart 

Я затем запустить запрос снова, и на этот раз я получаю 196 заказов!

Почему часовой пояс моего сервера влияет на него? Эпохи не должны быть затронуты этим.

ответ

2

The documentation for FROM_UNIXTIMESTAMP() четко говорится, что:

Возвращает представление UNIX_TIMESTAMP аргумента в качестве значения в YYYY-MM-DD HH:MM:SS или YYYYMMDDHHMMSS формате, в зависимости от того, используется ли функция в контексте строки или числа. Значение выражается в текущем часовом поясе. unix_timestamp - это внутреннее значение временной метки, которое создается функцией UNIX_TIMESTAMP().

Именно поэтому я настоятельно рекомендую вам запускать ваш сервер в UTC и делать какие-либо преобразования в вашем приложении или указывая смещение для своих запросов.

Epoch раз (например, UNIX time_t) выражены в UTC, но всегда отображаются в местном времени, если у вас есть часовой пояс, указанный в вашей среде, будь то MySQL или иным образом. Необработанное числовое значение не изменяется в зависимости от вашей часовой пояс, на самом деле оно вообще не имеет понятия о часовом поясе, но преобразование его в строку в формате YYYY-MM-DD абсолютно требует временной зоны для визуализации чего-либо значимого.

1

Конечно, часовой пояс. FROM_UNIXTIME() преобразует момент времени в представление даты/времени. Но данный момент может представлять другую дату или время в зависимости от часового пояса. Как указано в documentation:

Значение выражается в текущем часовом поясе.

Смежные вопросы