2010-01-14

Локальное время в MySQL отличается от времени в PHP

Начинаю понимать почему многие разработчики забивают на тип DATETIME в MySQL и используют вместо него целочисленные поля:

  $date = gmmktime(0,0,0,1,1,2010); //2010-01-01 00:00:00;
  DB::execute("insert into messages SET date_created=from_unixtime(?)",$date);  
  $id = DB::getLastID();
  
  $r = DB::execute("select date_created from messages where message_id=?",$id);
  print $r->fields[0]; //2010-01-01 03:00:00

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

Оказывается для MySQL нужно выставлять зону отдельно.

DB::execute("SET time_zone='".Config::$mysql_timezone."'");

причем, строковые значения вида 'America/New_York' для зоны дают странные результаты - почемуто у меня получилось расхождение в 34 секунды c PHP, возможно связано с тем, что MySQL высчитывает даты с использованием leap seconds c в PHP просто прибавляет или вычитает часовую разницу, поэтому решил, что лучше использоватать числовые зоны, типа SET time_zone='-5:00'.

 

комментарии:

 

Для того чтобы каждый раз не представляться можно войти как зарегистрированный пользователь.

Имя*

разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться