Пример: $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 в этом случае).