php для получения всех понедельников в диапазоне дат

Пример: $startDate – понедельник 2007-02-05 и $endDate – вторник 2007-02-20. Затем я хочу, чтобы он перечислял:

 Monday 2007-02-05 Monday 2007-02-12 Monday 2007-02-19 

Я просмотрел руководство по PHP и нашел, что все дни между двумя датами. Но как это сделать так, как я хочу? Код PHP:

Вместо того чтобы получать все дни и проходить через них все, получите первый понедельник после даты начала и затем повторите 7 дней за раз:

 $endDate = strtotime($endDate); for($i = strtotime('Monday', strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i)) echo date('l Ym-d', $i); 

Вы можете использовать функцию ниже, чтобы получить массив дат между диапазоном дат определенного дня.

Вы должны ввести дату начала, дату окончания и день в номере. Номер дня следующий. 1 = понедельник, 2 = вторник, 3 = среда, 4 = четверг. 5 = пятница, 6 = суббота, 7 = воскресенье.

 function getDateForSpecificDayBetweenDates($startDate,$endDate,$day_number){ $endDate = strtotime($endDate); $days=array('1'=>'Monday','2' => 'Tuesday','3' => 'Wednesday','4'=>'Thursday','5' =>'Friday','6' => 'Saturday','7'=>'Sunday'); for($i = strtotime($days[$day_number], strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i)) $date_array[]=date('Ym-d',$i); return $date_array; } 

Мне нужно было то же самое и создать простой метод.

 public function getMondaysInRange($dateFromString, $dateToString) { $dateFrom = new \DateTime($dateFromString); $dateTo = new \DateTime($dateToString); $dates = []; if ($dateFrom > $dateTo) { return $dates; } if (1 != $dateFrom->format('N')) { $dateFrom->modify('next monday'); } while ($dateFrom <= $dateTo) { $dates[] = $dateFrom->format('Ym-d'); $dateFrom->modify('+1 week'); } return $dates; } 

Затем используйте его.

 $dateFromString = '2007-02-05'; $dateToString = '2007-02-20'; var_dump($this->getMondaysInRange($dateFromString, $dateToString)); 

Результат:

 array (size=3) 0 => string '2007-02-05' (length=10) 1 => string '2007-02-12' (length=10) 2 => string '2007-02-19' (length=10) 

Может быть, это будет полезно для кого-то.

 for ($i = strtotime($startDate); $i <= strtotime($endDate); $i = strtotime('+1 day', $i)) { if (date('N', $i) == 1) //Monday == 1 echo date('l Ym-d', $i); //prints the date only if it's a Monday } 

Это код для получения дня недели «$ startdate» и подсчета количества дней недели между двумя датами.


 `$ startdate` = '2015-03-01';
 `$ endate` = '2015-03-31';
 `$ recurringDay` = date ('N', strtotime ($ startdate));  // повторяющийся день с даты, т.е. понедельник = 1, вторник = 2 ... и т. д.
 $ begin = new DateTime (`$ startdate`);
     $ end = new DateTime (дата ('Ym-d', strtotime ('+ 1 день', strtotime ($ endate))));
     while (формат $ begin ('Ym-d');
         $ day [] = $ begin-> format ('N');
         $ begin-> modify ('+ 1 день');
     }
    $ С = 0;  // встречается счетчик

    foreach ($ day as $ key => $ dt) {

     if ($ dt == `$ recurringDay`) // сравнить его 
     {
       $ k [] = $ key;
       $ C ++;
     }
    }

    `$ nofDays` = $ c;  // количество понедельников, вторник

    foreach ($ k as $ pp) {
        // добавление кода сеанса
        `$ recurringDatetime []` = $ period [$ pp];  // повторяющиеся даты
        }

        print_r ( `$ recurringDatetime`);  // массив дат в понедельник, вторник.

i Создать класс, вы получаете все дни в диапазоне Дата группы по названию дня:

  class DayHelper{ const MONDAY = 'Mon'; const TUESDAY = 'Tue'; const WEDENSDAY = 'Wed'; const THURSDAY = 'Thu'; const FRIDAY = 'Fri'; const SATURDAY = 'Sat'; const SUNDAY = 'Sun'; public function GetYeardays($dateStart, $dateend){ $period = new \DatePeriod( new \DateTime($dateStart), new \DateInterval('P1D'), (new \DateTime($dateend)) ); $dates = iterator_to_array($period); $arrayreturn = array(); foreach ($dates as $val) { $date = $val->format('Ym-d'); //format date $get_name = date('l', strtotime($date)); //get week day $day_name = substr($get_name, 0, 3); // Trim day name to 3 chars switch ($day_name) { case self::MONDAY: $MONDAY[] = $date; $arrayreturn[self::MONDAY] = $MONDAY; break; case self::TUESDAY: $TUESDAY[] = $date; $arrayreturn[self::TUESDAY] = $TUESDAY; break; case self::WEDENSDAY: $WEDENSDAY[] = $date; $arrayreturn[self::WEDENSDAY] = $WEDENSDAY; break; case self::THURSDAY: $THURSDAY[] = $date; $arrayreturn[self::THURSDAY] = $THURSDAY; break; case self::FRIDAY: $FRIDAY[] = $date; $arrayreturn[self::FRIDAY] = $FRIDAY; break; case self::SATURDAY: $SATURDAY[] = $date; $arrayreturn[self::SATURDAY] = $SATURDAY; break; case self::SUNDAY: $SUNDAY[] = $date; $arrayreturn[self::SUNDAY] = $SUNDAY; break; } } return $arrayreturn; } } 

Результат будет таким:

  array (size=7) 'Fri' => array (size=5) 0 => string '2016/01/01' (length=10) 1 => string '2016/01/08' (length=10) 2 => string '2016/01/15' (length=10) 3 => string '2016/01/22' (length=10) 4 => string '2016/01/29' (length=10) 'Sat' => array (size=5) 0 => string '2016/01/02' (length=10) 1 => string '2016/01/09' (length=10) 2 => string '2016/01/16' (length=10) 3 => string '2016/01/23' (length=10) 4 => string '2016/01/30' (length=10) 'Sun' => array (size=4) 0 => string '2016/01/03' (length=10) 1 => string '2016/01/10' (length=10) 2 => string '2016/01/17' (length=10) 3 => string '2016/01/24' (length=10) 'Mon' => array (size=4) 0 => string '2016/01/04' (length=10) 1 => string '2016/01/11' (length=10) 2 => string '2016/01/18' (length=10) 3 => string '2016/01/25' (length=10) 'Tue' => array (size=4) 0 => string '2016/01/05' (length=10) 1 => string '2016/01/12' (length=10) 2 => string '2016/01/19' (length=10) 3 => string '2016/01/26' (length=10) 'Wed' => array (size=4) 0 => string '2016/01/06' (length=10) 1 => string '2016/01/13' (length=10) 2 => string '2016/01/20' (length=10) 3 => string '2016/01/27' (length=10) 'Thu' => array (size=4) 0 => string '2016/01/07' (length=10) 1 => string '2016/01/14' (length=10) 2 => string '2016/01/21' (length=10) 3 => string '2016/01/28' (length=10) 

Преобразовать $ startDate и $ endDate до этого на отметки времени:

 foreach ( $date = $start; $date <= $end; $date += 60 * 60 * 24) { if ( strftime('%w', $date) == 1 ) { $mondays[] = strftime('%A %Y-%m-%d', $date); } } 
 $dates = array(); $dates[] = strtotime($start); for($i = 0; $i <= 12; $i++){ $dates[] = strtotime('+1 week', $dates[$i]); } foreach($dates as $date){ echo date("dmY", $date); } 

У меня была аналогичная проблема, и курсы можно начинать в любой день. Этот скрипт выбирает начальный день и собирает следующие дни каждую неделю до желаемой суммы (12 в этом случае).