Информация о летнем времени MySQL, похоже, неверна.Как я могу убедиться, что он актуален в Windows? - PullRequest
0 голосов
/ 02 октября 2018

Я обнаружил, что ошибка в моей программе была вызвана тем, что функция MySQL UNIX_TIMESTAMP () возвращала значение, отличное от PHP strtotime (), когда вводился тот же самый ввод.

Затем я обнаружил, что это дата, когда ошибкаСлучилось так, что дата вступила в силу переход на летнее время в моем часовом поясе.

Поэтому мне нужно знать, почему PHP знает о дате начала перехода на летнее время, а MySQL - нет.Разве и PHP, и MySQL не должны получать информацию о часовом поясе и летнем времени из операционной системы?

Операционная система - Windows 7, и, согласно программе Центра обновления Windows, она обновлена ​​до исправлений.

Вот мой код:

<code>// Checking timezones in MySQL and PHP.
echo "<pre>\n";
echo "date_default_timezone_get(): " . date_default_timezone_get() . "\n";
echo "date('P'): " . date('P') . "\n";
echo "MySQL timezone: " . $sqlObj->fetchField('SELECT IF(@@session.time_zone="SYSTEM", @@system_time_zone, @@session.time_zone)') . "\n";

// Testing MySQL and PHP conversion to unix timestamp for specific datetime values.
for ($hour = 0; $hour < 5; ++$hour)
{
   $timeString         = '2018-10-07 ' . (($hour < 10)? '0': '') . "$hour:00:00";
   $timestampFromMySql = $sqlObj->fetchField('SELECT UNIX_TIMESTAMP(?)', array($timeString));
   $timestampFromPhp   = strtotime($timeString);
   echo " * timestring        : $timeString\n";
   echo "   timestampFromMySql: $timestampFromMySql\n";
   echo "   timestampFromPhp  : $timestampFromPhp\n";

   // Checking daylight savings status for the date in question in PHP.
   echo "   date('I', \$timestampFromMySql): " . date('I', $timestampFromMySql) . "\n";
   echo "   date('I', \$timestampFromPhp  ): " . date('I', $timestampFromPhp  ) . "\n";

   echo "   difference: " . ($timestampFromMySql - $timestampFromPhp) . "\n";
}

echo "
\ n ";

Вот вывод. Обратите внимание, что разница в 3600 секунд или один час появляется в unix-размерах, сообщаемых PHP иMySQL в 3 часа утра. * 10101 *

date_default_timezone_get(): Australia/Melbourne
date('P'): +10:00
MySQL timezone: +10:00
 * timestring        : 2018-10-07 00:00:00
   timestampFromMySql: 1538834400
   timestampFromPhp  : 1538834400
   date('I', $timestampFromMySql): 0
   date('I', $timestampFromPhp  ): 0
   difference: 0
 * timestring        : 2018-10-07 01:00:00
   timestampFromMySql: 1538838000
   timestampFromPhp  : 1538838000
   date('I', $timestampFromMySql): 0
   date('I', $timestampFromPhp  ): 0
   difference: 0
 * timestring        : 2018-10-07 02:00:00
   timestampFromMySql: 1538841600
   timestampFromPhp  : 1538841600
   date('I', $timestampFromMySql): 1
   date('I', $timestampFromPhp  ): 1
   difference: 0
 * timestring        : 2018-10-07 03:00:00
   timestampFromMySql: 1538845200
   timestampFromPhp  : 1538841600
   date('I', $timestampFromMySql): 1
   date('I', $timestampFromPhp  ): 1
   difference: 3600
 * timestring        : 2018-10-07 04:00:00
   timestampFromMySql: 1538848800
   timestampFromPhp  : 1538845200
   date('I', $timestampFromMySql): 1
   date('I', $timestampFromPhp  ): 1
   difference: 3600

Google сообщает мне, что переход на летнее время 2018 года в Мельбурне начнется в 2 часа ночи в воскресенье, 7 октября, и часы перейдут на один час вперед, поэтому в 2 часа ночи 7 октября 2018 годана самом деле это то же самое время, что и 3 часа ночи 7 октября 2018 года, и поэтому ожидается поведение, которое я наблюдаю из PHP в приведенных выше выходных данных скрипта. Поведение MySQL кажется неправильным.

Может кто-нибудь сказать мне, как обеспечитьMySQL имеет актуальную информацию, касающуюся перехода на летнее время?

Также я обнаружил, что все таблицы mysql.time_zone пусты. Означает ли это, что в MySQL нет часового пояса?информация, или это означает, что информация о часовом поясе MySQL поступает из операционной системы?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Соответствующая документация здесь: https://dev.mysql.com/doc/refman/5.5/en/time-zone-upgrades.html

Ключевые предложения:

"Время операционной системы влияет на значение, которое сервер MySQL использует для времен, если установлен его часовой поясto SYSTEM "

и

" Если вы используете именованные часовые пояса с MySQL, убедитесь, что таблицы часовых поясов в базе данных mysql обновлены. "

Позжев документации говорится, что если таблица mysql.time_zone_name пуста, то никто не может использовать именованные часовые пояса, и вам не нужно обновлять таблицы.


Итак, чтобы заставить MySQL использоватьИнформация об операционной системе для часовых поясов и периодов летнего времени, установите часовой пояс на «SYSTEM».

Кроме того, если часовой пояс установлен на «SYSTEM», вам не нужно заполнять таблицы mysql.time_zone.


После установки часового пояса MySQL на «SYSTEM», запустив «SET time_zone =« SYSTEM »», я перезапустил скрипт из вопроса и получил следующий вывод, который показывает, что PHP и MySQL ведут себя кактак жепуть, как и ожидалось.

date_default_timezone_get(): Australia/Melbourne
date('P'): +10:00
MySQL timezone: AUS Eastern Standard Time
 * timestring        : 2018-10-07 00:00:00
   timestampFromMySql: 1538834400
   timestampFromPhp  : 1538834400
   date('I', $timestampFromMySql): 0
   date('I', $timestampFromPhp  ): 0
   difference: 0
 * timestring        : 2018-10-07 01:00:00
   timestampFromMySql: 1538838000
   timestampFromPhp  : 1538838000
   date('I', $timestampFromMySql): 0
   date('I', $timestampFromPhp  ): 0
   difference: 0
 * timestring        : 2018-10-07 02:00:00
   timestampFromMySql: 1538841600
   timestampFromPhp  : 1538841600
   date('I', $timestampFromMySql): 1
   date('I', $timestampFromPhp  ): 1
   difference: 0
 * timestring        : 2018-10-07 03:00:00
   timestampFromMySql: 1538841600
   timestampFromPhp  : 1538841600
   date('I', $timestampFromMySql): 1
   date('I', $timestampFromPhp  ): 1
   difference: 0
 * timestring        : 2018-10-07 04:00:00
   timestampFromMySql: 1538845200
   timestampFromPhp  : 1538845200
   date('I', $timestampFromMySql): 1
   date('I', $timestampFromPhp  ): 1
   difference: 0
0 голосов
/ 02 октября 2018

Это известная «особенность» функции UNIX_TIMESTAMP в MySQL

https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

Примечание: если вы используете UNIX_TIMESTAMP () и FROM_UNIXTIME () для преобразования между значениями TIMESTAMP и UnixВ метках времени преобразование происходит с потерями, поскольку в обоих направлениях сопоставление не однозначное.Например, из-за соглашений об изменениях местного часового пояса, две UNIX_TIMESTAMP () могут отобразить два значения TIMESTAMP на одно и то же значение метки времени Unix.FROM_UNIXTIME () отобразит это значение обратно только в одно из исходных значений TIMESTAMP.Вот пример использования значений TIMESTAMP в часовом поясе CET:

Walkaround - использовать функции времени только в PHP, MySQL только для хранения (формат даты и времени)

...