Я пытаюсь получить неделю с месяца, начиная с понедельника и заканчивая воскресеньем в том же месяце. я буду предоставлять месяц и год. например:
$month = '03'; $year = '2014';
то функция должна вернуться с 2014-03-03 to 2014-03-09
качестве даты начала месяца, в течение месяца первый понедельник на 3-м. затем продолжайте до месяца до прошлой недели. В марте 2014 года 31-й стартовал в понедельник, но не заканчивается в марте, он заканчивается в 06-04-2014, поэтому это не следует включать в подсчет.
Теперь, когда я пропускаю месяц как «04», чем месяц, он должен считать 31-й марш на своей первой неделе.
Надеюсь, я сделаю свое ясное, извините за язык. Я уже пробовал:
$month = "04"; $year = "2014"; $beg = (int)date('W', strtotime("first day of $year-$month")); $end = (int)date('W', strtotime("last day of $year-$month")); $weeks = range($beg, $end); foreach($weeks as $week) { $result = $this->getStartAndEndDate($week, $year); print_r($result); } function getStartAndEndDate($week, $year) { $time = strtotime("1 January $year", time()); $day = date('w', $time); $time += ((7*$week)+1-$day)*24*3600; $return[0] = date('Ym-d', $time); $time += 6*24*3600; $return[1] = date('Ym-d', $time); return $return; }
ВЫВОД:
Array ( [0] => 2014-03-03 [1] => 2014-03-09 ) Array ( [0] => 2014-03-10 [1] => 2014-03-16 ) Array ( [0] => 2014-03-17 [1] => 2014-03-23 ) Array ( [0] => 2014-03-24 [1] => 2014-03-30 ) Array ( [0] => 2014-03-31 [1] => 2014-04-06 ) Array ( [0] => 2014-04-07 [1] => 2014-04-13 )
Для этого можно использовать класс DateTime
:
$dt = new DateTime('1st march'); // is this a monday? if($dt->format('N') !== '1') { // if not, went to next monday $dt->modify('next monday'); } echo $dt->format('Ym-d') . ' to ' . $dt->modify('next sunday')->format('Ym-d');
Вывод:
2014-03-03 to 2014-03-09
<?php function get_weeks($month, $year) { $weeks = array(); $date = DateTime::createFromFormat('mY', $month.$year); $date->modify('first Monday of this month'); $end = clone $date; $end->modify('last Monday of this month'); $interval = DateInterval::createFromDateString('1 week'); $period = new DatePeriod($date, $interval, $end); $counter = 1; foreach ($period as $dt) { $end_of_week = clone $dt; $end_of_week->modify('next Sunday'); $weeks[] = sprintf("Week %u: %s - %s", $counter, $dt->format('Ym-d'), $end_of_week->format('Ym-d') ); $counter++; } return $weeks; } $weeks = get_weeks('03', '2014'); print_r($weeks); Array ( [0] => Week 1: 2014-03-03 - 2014-03-09 [1] => Week 2: 2014-03-10 - 2014-03-16 [2] => Week 3: 2014-03-17 - 2014-03-23 [3] => Week 4: 2014-03-24 - 2014-03-30 )
Смотрите это в действии