Разница в часовых поясах между PHP и MySQL

Я столкнулся с проблемой, по которой PHP и MySQL, похоже, не согласны с тем, в какой временной области они должны использоваться при преобразовании определенных временных меток в дату и время.

Проблема возникает, когда у меня есть метка времени, которую я хотел бы преобразовать обратно в формат datetime . PHP дает дату и время, исходя из того, что GMT является часовым поясом, но MySQL, похоже, считает, что он работает в GMT + 1 и преобразуется соответствующим образом.

Простое воспроизведение

 $original_date = '2009-08-31 23:59:59'; $timestamp = strtotime($original_date); echo $timestamp; // Gives 1251763199 echo date('Ymd H:i:s', $timestamp); // PHP: 2009-08-31 23:59:59 echo db_field('SELECT FROM_UNIXTIME(1251763199)'); // MySQL: 2009-09-01 00:59:59 

Временная метка, заданная PHP, кажется правильной для указанной даты, если часовой пояс GMT. Результат MySQL был бы правильным, если бы мы запускали BST (временная метка упала в пределах GMT + 1 в то время).

Если я попробую выше с $timestamp с сегодняшнего дня ( 1267640942 ), PHP и MySQL оба, похоже, с удовольствием скажут мне, что это 2010-03-03 18:29:02 (оба возвращаются GMT).

Какой часовой пояс установлен на серверах?

Я проверил документы MySQL , которые говорят, что если мой часовой пояс установлен в system то ОС будет предоставлять информацию о часовом поясе. На данный момент это выглядит так:

 mysql> SELECT @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 

Часовой пояс по умолчанию на моем веб-сервере – GMT. Это также системный часовой пояс по умолчанию на моем сервере базы данных (в соответствии с командой date выполняемой на cl на каждом сервере).

 foo@bar:/home/foo$ date Wed Mar 3 18:45:02 GMT 2010 

Поэтому, согласно документам, мой сервер БД должен работать в GMT, что мы и хотим. Однако вывод запроса, приведенный в моих тестовых сценариях, показывает, что он работает в GMT + 1.

Я знаю, что существует ряд обходных путей для этой проблемы (все арифметические даты выполняются полностью в PHP или MySQL и т. Д.), Но я хотел бы разобраться в том, что вызывает это несоответствие, чтобы мы могли разобраться и предотвратить кого-либо иначе в команде его не подведут.

Кто-нибудь знает, есть ли очень базовые настройки, которые я просматривал здесь, или знаю, что может вызвать это несоответствие?

Благодаря!

Я бы предложил использовать UTC на вашем сервере и MySQL установить и преобразовать часовой пояс (ы) в то, что вы хотите. Преобразование в MySQL и PHP довольно просто.

я использую эту методологию:

позаботьтесь о PHP и оставите mysql в покое

рекомендуется установить часовой пояс по умолчанию для php через функцию date_default_timezone_set php.

используйте тип поля TIMESTAMP для сохранения записи даты в mySql

затем, когда вы вставляете:

 $sDate = date("Ymd H:i:s"); mysql_query("insert into `table` set `created_on` = '$sDate' "); 

и когда вы выбираете:

 mysql_query("select `created_on` from `table` "); $iTime = strtotime($aRow['created_on']); 

вы всегда можете получить доступ к глобальному времени с помощью функции gmdate php:

 $iTime_Global = gmdate("U", $iTime); 

часовой пояс mysql не повлияет на ваше приложение, если вы просто позаботитесь о своем PHP-коде. (что сделано по часовому поясу)