PHP

Откуда берутся 18000 секунд PHP?

Записываю в базу date, потом достаю значение в секундах из базы с помощью UNIX_TIMESTAMP отнимаю от time() и откуда то появляются лишние 18000
 $time = date('Y-m-d H:i:s');
$db->query("INSERT INTO `data`(`time`) VALUES ('$time')");
$data = $db->query("SELECT UNIX_TIMESTAMP(`time`) FROM `data`")->fetch_column();
echo time() - $date; // В результате 18000 + прошедшие секунды
Проблема, из-за которой вы получаете лишние 18000 секунд, связана с разницей в часовых поясах.

UNIX_TIMESTAMP возвращает время в формате UTC (Универсальное координированное время), которое не учитывает часовой пояс вашего сервера или ваше текущее местное время. Вероятно, разница в 18000 секунд (5 часов) происходит из-за того, что ваш сервер настроен на другой часовой пояс.

Чтобы решить эту проблему, вам нужно учесть разницу в часовых поясах между вашим сервером и вашим местным временем при вычислении разницы во времени.

Примерный код, который может помочь вам получить правильную разницу в секундах:


Copy code
// Получение текущего местного времени
$localTime = time();

// Получение времени из базы данных в формате UTC
$dbTime = $data[0];

// Получение разницы в часах между сервером и местным временем
$timeZoneOffset = date('Z') / 3600; // Разница в секундах, деленная на 3600 для получения часов

// Вычисление разницы в секундах
$timeDifference = $localTime - $dbTime - ($timeZoneOffset * 3600);

echo $timeDifference;
В этом коде мы вычитаем разницу в часах между сервером и местным временем, умноженную на 3600, чтобы преобразовать разницу в секунды.

Убедитесь также, что ваш сервер настроен на правильный часовой пояс. Если сервер работает на Linux, вы можете настроить часовой пояс в файле php.ini или использовать функцию date_default_timezone_set() в PHP для установки нужного часового пояса в вашем скрипте.
Максим Сорокин
Максим Сорокин
294
Лучший ответ
У тебя часовые пояса на сервере, в PHP и в MySQL как настроены?
+5 - это больше привычных московских +3.

Есть функция https://www.php.net/manual/ru/function.gmdate.php - которая как раз по Гринвичу форматирует.
Олег Лиуконен
Олег Лиуконен
58 876
Дмитрий Болоткин Я переменные для примера поставил, в коде по другому. Пользователь выше подсказал что:
date() - локальное время
time() - GMT
Можно превратить date() в GMT?
Дмитрий Болоткин А точно, есть же вроде gmdate()
Дмитрий Болоткин Неа, всё равно не помогло, а можно отнять date() от date() как то так
 $date = '2023-06-09 23:51:14';
date('Y-m-d H:i:s') - $date;
date() - локальное время
time() - GMT
Юрий ***
Юрий ***
80 864
Дмитрий Болоткин А можно превратить date() в GMT?
Эта проблема может быть связана с разницей в часовых поясах, которую использует PHP и ваша база данных. UNIX_TIMESTAMP в MySQL возвращает время в секундах, начиная с '1970-01-01 00:00:00' UTC, а функция `time()` в PHP возвращает текущее время также в секундах начиная с '1970-01-01 00:00:00' UTC.

Однако, функция `date('Y-m-d H:i:s')` в PHP возвращает текущее время в локальном часовом поясе, который задан в настройках PHP.

То есть, если ваша база данных работает в часовом поясе UTC, а PHP использует другой часовой пояс, отличный от UTC на 5 часов, то разница будет составлять 18000 секунд (5 часов * 60 минут * 60 секунд).

Для решения этой проблемы, вы можете:

1. Установить один и тот же часовой пояс для PHP и MySQL.
2. Использовать функцию `gmdate('Y-m-d H:i:s')` вместо `date('Y-m-d H:i:s')` в PHP. Функция `gmdate()` возвращает время в часовом поясе UTC.
Не уверен
$time - это строка, а поле time может быть не строковое?
Лучше $time преобразовать в секунды и потом вставлять в таблицу
Денис Кукаев
Денис Кукаев
5 705
Дмитрий Болоткин Нет, кажется уже нашёл, date делает время установленное в бд