У меня есть 2 даты в PHP, как я могу запустить цикл foreach, чтобы пройти через все эти дни?

Я начинаю с даты 2010-05-01 и заканчивая 2010-05-10 . Как я могу перебирать все эти даты в PHP?

Требуется PHP5.3:

 $begin = new DateTime( '2010-05-01' ); $end = new DateTime( '2010-05-10' ); $interval = DateInterval::createFromDateString('1 day'); $period = new DatePeriod($begin, $interval, $end); foreach ( $period as $dt ) echo $dt->format( "l Ymd H:i:s\n" ); 

Это будет выводить все дни за определенный период между $start и $end . Если вы хотите включить 10-й, установите $end в 11-й. Вы можете настроить формат по своему вкусу. См. Руководство по PHP для DatePeriod .

Это также включает в себя последнюю дату

 $begin = new DateTime( "2015-07-03" ); $end = new DateTime( "2015-07-09" ); for($i = $begin; $i <= $end; $i->modify('+1 day')){ echo $i->format("Ymd"); } 

Если вам не нужна последняя дата, просто удалите = из условия.

Преобразование в временные метки unix упрощает выполнение математики с датой в php:

 $startTime = strtotime( '2010-05-01 12:00' ); $endTime = strtotime( '2010-05-10 12:00' ); // Loop between timestamps, 24 hours at a time for ( $i = $startTime; $i <= $endTime; $i = $i + 86400 ) { $thisDate = date( 'Ym-d', $i ); // 2010-05-01, 2010-05-02, etc } 

При использовании PHP с часовым поясом, имеющим DST, обязательно добавьте время, которое не равно 23:00, 00:00 или 1:00, чтобы защитить от пропусков или повторений дней.

 $startTime = strtotime('2010-05-01'); $endTime = strtotime('2010-05-10'); // Loop between timestamps, 1 day at a time $i = 1; do { $newTime = strtotime('+'.$i++.' days',$startTime); echo $newTime; } while ($newTime < $endTime); 

или

 $startTime = strtotime('2010-05-01'); $endTime = strtotime('2010-05-10'); // Loop between timestamps, 1 day at a time do { $startTime = strtotime('+1 day',$startTime); echo $startTime; } while ($startTime < $endTime); 

Копировать из примера php.net для открытого диапазона:

 $begin = new DateTime( '2012-08-01' ); $end = new DateTime( '2012-08-31' ); $end = $end->modify( '+1 day' ); $interval = new DateInterval('P1D'); $daterange = new DatePeriod($begin, $interval ,$end); foreach($daterange as $date){ echo $date->format("Ymd") . "<br>"; } 

Пользователь этой функции: –

 function dateRange($first, $last, $step = '+1 day', $format = 'Ymd' ) { $dates = array(); $current = strtotime($first); $last = strtotime($last); while( $current <= $last ) { $dates[] = date($format, $current); $current = strtotime($step, $current); } return $dates; } 

Использование / вызов функции: –

Увеличение на один день: –

 dateRange($start, $end); //increment is set to 1 day. 

Увеличение по месяцам: –

 dateRange($start, $end, "+1 month");//increase by one month 

используйте третий параметр, если вы хотите установить формат даты: –

  dateRange($start, $end, "+1 month", "Ymd H:i:s");//increase by one month and format is mysql datetime 

Вот еще один простой –

 /** * Date range * * @param $first * @param $last * @param string $step * @param string $format * @return array */ function dateRange( $first, $last, $step = '+1 day', $format = 'Ymd' ) { $dates = []; $current = strtotime( $first ); $last = strtotime( $last ); while( $current <= $last ) { $dates[] = date( $format, $current ); $current = strtotime( $step, $current ); } return $dates; } 

Пример:

 print_r( dateRange( '2010-07-26', '2010-08-05') ); Array ( [0] => 2010-07-26 [1] => 2010-07-27 [2] => 2010-07-28 [3] => 2010-07-29 [4] => 2010-07-30 [5] => 2010-07-31 [6] => 2010-08-01 [7] => 2010-08-02 [8] => 2010-08-03 [9] => 2010-08-04 [10] => 2010-08-05 ) 

вот путь:

  $date = new Carbon(); $dtStart = $date->startOfMonth(); $dtEnd = $dtStart->copy()->endOfMonth(); $weekendsInMoth = []; while ($dtStart->diffInDays($dtEnd)) { if($dtStart->isWeekend()) { $weekendsInMoth[] = $dtStart->copy(); } $dtStart->addDay(); } 

Результат $ weekendsInMoth – это массив выходных дней!