Я начинаю с даты 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 – это массив выходных дней!