Поэтому у меня есть одна дата в виде строки:
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 />'; }