Получите все рабочие дни в неделю за определенную дату

Поэтому у меня есть одна дата в виде строки:

2011/06/01 

Мне нужно получить из него 5 объектов DateTime, которые соответствуют пяти будним дням (с понедельника по пятницу) на этой неделе , например, на указанную дату мне нужно 2011-05-30 – 2011-06-03.

Как это сделать? Я знаю, что могу сделать:

 $dateTime = new DateTime('2011/06/01'); 

Но я вроде как застрял там 🙂 Я знаю, смущающе.

Может использовать DatePeriod :

 $firstMondayThisWeek= new DateTime('2011/06/01'); $firstMondayThisWeek->modify('tomorrow'); $firstMondayThisWeek->modify('last Monday'); $nextFiveWeekDays = new DatePeriod( $firstMondayThisWeek, DateInterval::createFromDateString('+1 weekdays'), 4 ); print_r(iterator_to_array($nextFiveWeekDays)); 

Обратите внимание, что DatePeriod является Iterator , поэтому, если вы действительно не DatePeriod на наличие дат в массиве, вы можете просто пойти с DatePeriod качестве контейнера.

Вышеприведенное даст что-то вроде ( demo )

  Array ( [0] => DateTime Object ( [date] => 2011-05-30 00:00:00 [timezone_type] => 3 [timezone] => Europe/Berlin ) [1] => DateTime Object ( [date] => 2011-05-31 00:00:00 [timezone_type] => 3 [timezone] => Europe/Berlin ) [2] => DateTime Object ( [date] => 2011-06-01 00:00:00 [timezone_type] => 3 [timezone] => Europe/Berlin ) [3] => DateTime Object ( [date] => 2011-06-02 00:00:00 [timezone_type] => 3 [timezone] => Europe/Berlin ) [4] => DateTime Object ( [date] => 2011-06-03 00:00:00 [timezone_type] => 3 [timezone] => Europe/Berlin ) ) 

Одно из решений, которое было до 5.3.

 $firstMondayInWeek = strtotime('last Monday', strtotime('2011/06/01 +1 day')); $nextFiveWeekDays = array(); for ($days = 1; $days <= 5; $days++) { $nextFiveWeekDays[] = new DateTime( date('Ym-d', strtotime("+$days weekdays", $firstMondayInWeek)) ); } 

хотя я действительно не понимаю, почему вы хотели бы использовать объекты DateTime для этого, когда вы не можете использовать API в своем проекте. Как вы можете видеть, это все старые функции даты, когда DateTime является контейнером.

Пытаться:

 $dayAfter = $dateTime->modify('+1 day'); 

чтобы получить один день вперед. Для получения дополнительной информации ознакомьтесь с руководством по php этого класса .

Вы можете получить номер дня в неделю с датой ('w') 0 (для воскресенья) до 6 (для субботы). Из этого вы можете получить остальные рабочие дни с помощью strtotime («+ 1 день», [ваша временная метка]) и так далее. Когда у вас есть даты, вы можете сделать объекты.

Это похоже на работу:

 $d = date('N', strtotime('2011/06/01')); // here N means ISO-8601 numeric representation of the day of the week (added in PHP 5.1.0) $week = array(); for($i = 1; $i < $d; ++$i){ $dateTime = new DateTime('2011/06/01'); for($j = 0; $j < $i; ++$j){ $dateTime->modify('-1 day'); } $week[] = $dateTime; } $week[] = new DateTime('2011/06/01'); for($i = $d+1; $i <= 7; ++$i){ $dateTime = new DateTime('2011/06/01'); for($j = 0; $j < $i - $d; ++$j){ $dateTime->modify('+1 day'); } $week[] = $dateTime; } sort($week); foreach($week as $day){ echo $day->format('Ymd H:i:s'), '<br />'; } в $d = date('N', strtotime('2011/06/01')); // here N means ISO-8601 numeric representation of the day of the week (added in PHP 5.1.0) $week = array(); for($i = 1; $i < $d; ++$i){ $dateTime = new DateTime('2011/06/01'); for($j = 0; $j < $i; ++$j){ $dateTime->modify('-1 day'); } $week[] = $dateTime; } $week[] = new DateTime('2011/06/01'); for($i = $d+1; $i <= 7; ++$i){ $dateTime = new DateTime('2011/06/01'); for($j = 0; $j < $i - $d; ++$j){ $dateTime->modify('+1 day'); } $week[] = $dateTime; } sort($week); foreach($week as $day){ echo $day->format('Ymd H:i:s'), '<br />'; }