Буквально 3 дня назад имел счастье поразбираться (полазить по кодам) – такое случается редко, и после подобных разборок довольно хорошо поднимается экспириенс. А что еще нужно программисту кроме регулярного поднятия уровня опытности!?
Описание диспозиции
Есть форма, в этой форме есть поле для ввода даты/времени, для удобства ввода прикручена к этому полю JavaScript библиотека JSCalendar (симпотичный и удобный выпадающий календарик)
По сабмиту дата/время вставляется в таблицу в виде UnixTime, для конвертации в формат UnixTime использую следующую функцию
function format_to_unixtime($t)
{
list($date, $time) = split(' ', $t);list($day, $mon, $year) = split("/", $date);
list($hour, $min) = split(':', $time); return mktime($hour, $min, 0, $mon, $day, $year);
}
Для работы с базой данных MySQL использую библиотеку Дмитрия Котерова DBSimple.
Проблема
Проблема состояла в том, что когда просматривал список записей, даты отличалась от тех которые вводил на 6 часов.
Сложилось стойкое впечатление, что на каком-то этапе к дате плюсутся 6 часов из за смещения по гринвичу.
Следующий тестовый пример показал что дело в функции mysql FROM_UNIXTIME
include_once('conf.php');
include_once('lib/dbsimple/mysql.php');
//Подключаемся в MySQL
$db = DbSimple_Generic::connect("mysql://".$mysql_user.":".$mysql_passwd."@".$mysql_host."/".$mysql_db);
// Устанавливаем обработчик ошибок MySQL.
$db->setErrorHandler('databaseErrorHandler');
$db->setIdentPrefix($mysql_table_prefix);
$dt = '18/06/2008 10:10';
$db->query("insert into test (dt) values (?)", format_to_unixtime($dt));
echo $dt."
";
echo format_to_unixtime($dt)."
";
$recs = $db->select("select id, dt, FROM_UNIXTIME(dt, '%d/%m/%Y %H:%i') ddt from test");
print_r($recs);
function format_to_unixtime($t)
{
list($date, $time) = split(' ', $t);
list($day, $mon, $year) = split("/", $date);
list($hour, $min) = split(':', $time);
return mktime($hour, $min, 0, $mon, $day, $year);
}
?>
18/06/2008 10:10
1213783800
Array
(
[id] => 1
[dt] => 1213783800
[ddt] => 18/06/2008 16:10
)
А вот что написано на странице http://dev.mysql.com/doc/refman/6.0/en/date-and-time-functions.html
FROM_UNIXTIME() functions return values in the connection’s current time zone, which is available as the value of the time_zone system variable.
Вывод: читать документацию надо чаще.