Я на AWS использую экземпляр mysql RDS версии 5.5.40-log.
Я использую PHP 5.5.12 и соединяюсь с mysqli.
Я пытался отследить ошибку sql в скрипте и обнаружил, что, несмотря на установку часового пояса для соединения с «Австралия / Сидней», он остается в UTC, а вызов sql now () возвращает неправильное время. Так что мои результаты отсутствуют.
Ниже я делаю упрощенный вызов, который, несмотря на изменение TZ, не имеет никакого значения для результата now ().
$db = new mysqli("axxxx.chxxxxx.ap-soxxxxt-2.rds.amazonaws.com", "xxxx", "xxxxx", "xxxx");
$db->query("SET timezone = 'Australia/Sydney'");
$res = $db->query("SELECT @@session.time_zone tz, now() now");
for ($row_no = $res->num_rows - 1; $row_no >= 0; $row_no--) {
$res->data_seek($row_no);
$row = $res->fetch_assoc();
echo " id = " . $row['tz'] . "\n";
echo " now = " . $row['now'] . "\n";
}
Это приводит к:
id = UTC
сейчас = 2015-06-07 01:46:05
Фактическое время здесь 11:46.
Если я захожу в базу данных mysql через mysqlworkbench и запускаю тот же код оно работает. Таким образом, проблема, похоже, в том, что сеанс TZ не устанавливается в соединении php mysqli, и я не уверен, почему?
Я вижу, что таблица mysql.time_zone_name заполнена примерно так:
Африка / Абиджан 1
Африка / Абиджан 2
…так далее
РЕДАКТИРОВАТЬ
Я создаю новый прямой сеанс в mysqlworkbench:
SELECT @@global.time_zone, @@session.time_zone; -- UTC UTC
SELECT now(); -- 2015-06-07 21:55:54 <<incorrect time
SET time_zone = 'Australia/Sydney';
SELECT @@global.time_zone, @@session.time_zone; -- UTC Australia/Sydney
SELECT now(); -- 2015-06-08 07:55:03 <<correct time
Я использовал @@ session.time_zone в моем примере, так как эта переменная обновляется при установке системы time_zone напрямую.
Репликация того же самого через mysqli и php делает не обновите это, и функция now () не возвращает правильную дату. Следовательно, чего-то не хватает.
Вы устанавливаете timezone
переменная, но выбирая @@session.time_zone
, Правильный путь состоит в том, чтобы установить @@session.time_zone
переменная:
mysql> SET @@session.time_zone='Australia/Sydney';
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT @@session.time_zone;
+---------------------+
| @@session.time_zone |
+---------------------+
| Australia/Sydney |
+---------------------+
1 row in set (0.00 sec)
Других решений пока нет …