Вывести даты с промежутка времени

Bodyanuk

Новичок
Здравствуйте. Извините за название темы, не знал как правильно назвать для ПС и для людей.

Для начала предоставлю своё решение, которое простое и предназначено для 1-го месяца.

Есть промежуток времени, который я получаю через $_POST
PHP:
$_POST= array(
'start' => '2013-03-01',
'end' => '2013-03-05,
);
Обработка
PHP:
            $d = $_POST['start'];
            do {
                $result[] = $d++;
            } while($d <= $_POST['end']);
Результатом есть
PHP:
Array
(
    [0] => 2013-03-01
    [1] => 2013-03-02
    [2] => 2013-03-03
    [3] => 2013-03-04
    [4] => 2013-03-05
)
_____________________
Вроде всё просто, НО!!!
Если я ввожу разные месяца, то получается ошибка, потому что я придумываю 32, 33, 333 числа. Мне нужно как то переключаться между месяцами ИЛИ предложите своё интересное решение проблемы!

С уважением, Bodyanuk.
 

Тугай

Новичок
Если PHP 5.2 и выше:
PHP:
$d = new DateTime($_POST['start']);
$day = new DateInterval('P1D');
do {
  $d->add($day);
  $result[] = $d->format('Y-m-d');
} while($d->format('Y-m-d') <= $_POST['end']);
Для PHP 4:
PHP:
function add_date($givendate,$day=0,$mth=0,$yr=0) {
  $cd = strtotime($givendate);
  $newdate = date('Y-m-d', mktime(date('h',$cd),
  date('i',$cd), date('s',$cd), date('m',$cd)+$mth,
  date('d',$cd)+$day, date('Y',$cd)+$yr));
  return $newdate;
}

$d = $_POST['start'];
do {
  $result[] = add_date($d,1);
} while($d <= $_POST['end']);
 

Bodyanuk

Новичок
Спасибо, но на сервере стоит PHP Version 5.2.17, а сам сайт на FW Kohana 3. Выдало ошибку
Fatal error: Class 'DateInterval' not found in /home/admin/domains/sunny-rent.ru/public_html/application/controllers/orderitem.php on line 67
 

fixxxer

К.О.
Партнер клуба
Dateinterval = php 5.3+

Но 5.2 давно пора обновлять, он официально не поддерживается и уже несколько лет как.
 

Bodyanuk

Новичок
Спасибо, нужно тогда менять хостера, а это не очень удобно... решил попробовать второй вариант, а он не работает
PHP:
function add_date($givendate,$day=0,$mth=0,$yr=0) {
  $cd = strtotime($givendate);
  $newdate = date('Y-m-d', mktime(date('h',$cd),
  date('i',$cd), date('s',$cd), date('m',$cd)+$mth,
  date('d',$cd)+$day, date('Y',$cd)+$yr));
  return $newdate;
}

$d = $_POST['start'];
do {
  $result[] = add_date($d,1);
} while($d <= $_POST['end']);
Безконечный цикл, так как $d не меняется, подскажите как поправить функцию?
 

uid

Новичок
>Безконечный цикл, так как $d не меняется
Он и не должен меняться.

PHP:
 function add_date($givendate,$day=0,$mth=0,$yr=0) {
  $cd = strtotime($givendate);
  $newdate = date('Y-m-d', mktime(date('h',$cd),
  date('i',$cd), date('s',$cd), date('m',$cd)+$mth,
  date('d',$cd)+$day, date('Y',$cd)+$yr));
  return $newdate;
}

$start = 1;
$end = 123;
$result = array();
do {
  $result[] = add_date($start,1);
} while($start <= $end);
а так?
 

Bodyanuk

Новичок
Господа программисты, разрабы и т.д. Всё просче чем кажется, ещё вчера думал попробовать сделать так, но никак не мог добраться...

Одна минута содержит в себе целых 60 секунд, а один час - в 60 раз болше, каждый час содержит в себе 60 минут или тех же 60*60 секунд. Тоесть сутки = 24*60*60. И если сделать вот так:
PHP:
$start = strtotime('2013-02-25');
            $end = strtotime('2013-03-02');
            do {
                $result[] = date('Y-m-d', $start);
                $start += 24*60*60;
            } while($start <= $end);
То получим следующий ответ
PHP:
Array
(
    [0] => 2013-02-25
    [1] => 2013-02-26
    [2] => 2013-02-27
    [3] => 2013-02-28
    [4] => 2013-03-01
    [5] => 2013-03-02
)
Всем спасибо)
 

Тугай

Новичок
Bodyanuk
Ты курт, ты почти постиг истину, что такое unix time() и что он измеряется в секундах, не от Рождества Христова, а от 1 января 1970 г. и эра "терминаторов" уже давно начилась. :)
Чуть усилия и ты поймешь, что работа с датой на компе это преобразование в их роботов летоисчисление и операции с ним и назад в наше григорианское.

P.S.
24*60*60 - это DateInterval php 5.3.x :)
 

Bodyanuk

Новичок
Круто, я дошёл к истине небольшими пинками, но к самой сути - сам. ПРиятно думать что твои мысли переплетаются с мыслями гениальными разработчиками :)
 

Fedor_A_Nohrin

Новичок
А так?

PHP:
<?php 

$ds = '2013-02-25';
$de = '2013-03-08';

$d = new DateTime($ds);
$dl = array();

while ($d->format('Y-m-d')<=$de) {
	$dl[] = $d->format('Y-m-d');
	$d->modify('+1 DAY');
}

echo "<pre>";
print_r($dl);
echo "</pre>";

?>
 
Сверху