Буквально 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
<?php 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."<br>"; echo format_to_unixtime($dt)."<br>"; $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);</strong> 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.
Вывод: читать документацию надо чаще.
Теги: php, Грабли, программирование
RSS подписка
Email подписка