Я обнаружил, что ошибка в моей программе была вызвана тем, что функция 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 поступает из операционной системы?