Прожить каждый день между двумя датами - PullRequest
2 голосов
/ 25 июня 2019
$start_dt = "2019-02-14";
$dt1_obj = new DateTime($start_dt);
$end_dt = "2019-05-05";
$dt2_obj = new DateTime($end_dt);


// get every day from $start_dt date to  $end_dt   
while ( $dt1_obj->add(new DateInterval('P1D'))->format('Y-m-d') <= $end_dt ) {
    $ddd = $dt1_obj;
    echo $ddd->sub(new DateInterval('P1D'))->format('Y-m-d');
    echo "\n";  
}

Это работает в бесконечном цикле. В чем причина?

Ответы [ 3 ]

1 голос
/ 25 июня 2019

Вы добавляете день в условие цикла, а затем вычитаете день в теле цикла (обратите внимание, что $ddd - это просто еще одна ссылка на того же объекта DateTime !). Вы можете начать день раньше и напечатать саму дату в цикле:

$start_dt = "2019-02-13";
$dt1_obj = new DateTime($start_dt);
$end_dt = "2019-05-05";
$dt2_obj = new DateTime($end_dt);

// get every day from $start_dt date to  $end_dt   
while ( $dt1_obj->add(new DateInterval('P1D'))->format('Y-m-d') <= $end_dt ) {
    echo $dt1_obj->format('Y-m-d');
    echo "\n";  
}
1 голос
/ 25 июня 2019

Попробуйте, это должно работать.

 $start_dt = "2019-02-14"; 
 $end_dt = "2019-05-05"; 
 $period = new DatePeriod(
           new DateTime($start_dt),
           new DateInterval('P1D'),
           new DateTime($end_dt)
 );

Чтобы получить даты, вы должны выполнить итерацию

 foreach ($period as $key => $value) {
    //$value->format('Y-m-d')       
 }
0 голосов
/ 25 июня 2019

Проблема в том, что вы добавляете один день, а затем вычитаете один ... Попробуйте вместо этого

// get every day from $start_dt date to  $end_dt   
while ( $dt1_obj->add(new DateInterval('P1D'))->format('Y-m-d') <= $end_dt ) {
    $ddd = $dt1_obj;
    echo $ddd->format('Y-m-d');
    echo "\n";  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...