MySQL преобразует дату и время (сохраняя UTC_TIMESTAMP) в количество секунд 1970

#php #mysql

#php #mysql

Вопрос:

Существует много похожих вопросов, но я считаю, что этот уникальный. (Извините, если это не так)

В нашей базе данных есть поле datetime с именем «date_sampled», которое мы храним с помощью UTC_TIMESTAMP()

Наша цель — вернуть количество секунд с 1970 года. Я заметил, что UNIX_TIMESTAMP(), если не указан аргумент, возвращает текущую UNIX_TIMESTAMP(), и если передается datetime (т.Е. 2011-10-10), возвращает временную метку в секундах.

Однако UTC_TIMESTAMP() так не работает, он возвращает только текущую временную метку UTC.

Итак, как я могу преобразовать мое поле DateTime (содержащее дату и время UTC) в секунды с 1970 года в MySQL? Если это невозможно сделать в MySQL, тогда будет работать PHP-решение.

Спасибо.

Ответ №1:

В MySQL есть функция TIMESTAMPDIFF, вы можете использовать ее примерно так

 SELECT TIMESTAMPDIFF(SECOND,'1970-01-01 00:00:00', YourUTCDateFromSomewhere)
 

Более подробная информация в документах — http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timestampdiff

Комментарии:

1. Хорошо, это довольно интересно. Я попробую. 🙂

Ответ №2:

Что вы UTC_TIMESTAMP пытались сделать, чего UNIX_TIMESTAMP не было? Временные метки Unix по определению находятся в UTC.

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

UNIX_TIMESTAMP уважает переменную MySQL time_zone , поэтому, если все ваши даты указаны в UTC, вы можете просто установить time_zone переменную вашего сеанса в UTC, что приведет UNIX_TIMESTAMP к отсутствию преобразования часового пояса при преобразовании даты и времени в метку времени.

 SET time_zone = ' 00:00'
 

Комментарии:

1. Спасибо! Это действительно проблема, с которой я столкнулся. Теперь это имеет смысл, ха-ха 🙂

Ответ №3:

Интересная проблема… Я понятия не имею, как это сделать с помощью SQL… но решением PHP было бы использовать функцию strtotime() ..

 <?php
echo strtotime('2011-10-10');
?>
 

Приведенный выше пример возвращает значение 1318219200, которое представляет собой количество секунд, прошедших с эпохи 1970 года