Я столкнулся с проблемой, по которой 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-коде. (что сделано по часовому поясу)