21 Ноябрь 2008

Два 2-х ноября

Писал цикл по дням в PHP. Есть переменные $f и $t, в которых начало и конец временного отрезка в SQL формате. У меня заданы начало: 2008-10-28 и конец 2008-11-10.
есть цикл, в котором к timestamp текущей даты прибавляет количество секунд в сутках:

$cur=$f; // цикл по $cur. вначале в ней $f
preg_match("/([0-9]{4})-([0-1]{1}[0-9]{1})-([0-3]{1}[0-9]{1})/",$cur,$matches); // разбиваем строку с датой
$curts=mktime(0,0,0,$matches[2],$matches[3],$matches[1]);  // получаем timestamp для начальной даты в 00:00:00
while ($cur<=$t) {
    echo "cur:".$cur."|t:".$t." (".$curts.")<br />"; // выводим текущую дату в цикле и конечную, timestamp текщей даты
    $curts+=24*60*60; // увеличиваем на сутки timestamp 
    $cur=date("Y-m-d",$curts);    

В итоге у меня на выводе получалось два 2-х ноября. Я долго смотрел в код с круглыми глазами, не понимая как такое может быть.

Потом догадался, тчо это от того, что 2-го ноября в штатах переводили часы, то есть через 24 часа от 00:00:00 2-го ноября было не 00:00:00 3-го, а 23:00:00 все того же второго ноября.

Фикс заключается в том, тчоб взять начальный timestamp посередине дня

$curts=mktime(12,0,0,$matches[2],$matches[3],$matches[1]);  // получаем timestamp для начальной даты в 12:00:00

Будьте бдительны, коллеги! 🙂

рубрики: PHP | 3 комментария