Получить номер недели в месяц с даты в PHP?

У меня есть массив случайных дат (не из MySQL). Мне нужно сгруппировать их по неделям как неделя1, неделя2 и т. Д. До недели5.

У меня есть это:

$dates = array('2015-09-01','2015-09-05','2015-09-06','2015-09-15','2015-09-17'); 

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

Я знаю, что могу получить номер недели, выполнив date('W',strtotime('2015-09-01')); но на этой неделе число – это число между годом (1-52), но мне нужен только номер недели месяца, например, в сентябре 2015 года существует 5 недель:

  • Неделя1 = с 1 по 5
  • Week2 = с 6 по 12
  • Неделя 3 = 13-19
  • Неделя4 = 20 – 26
  • Неделя5 = 27-30

Я должен иметь возможность получить неделю Week1, просто указав дату, например

 $weekNumber = getWeekNumber('2015-09-01') //output 1; $weekNumber = getWeekNumber('2015-09-17') //output 3; 

Я думаю, что эти отношения должны быть истинными (?) И пригодиться:

 Week of the month = Week of the year - Week of the year of first day of month + 1 

Реализованный в PHP, вы получаете следующее:

 function weekOfMonth($date) { //Get the first day of the month. $firstOfMonth = strtotime(date("Ym-01", $date)); //Apply above formula. return intval(date("W", $date)) - intval(date("W", $firstOfMonth)) + 1; } 

Чтобы получить недели, начинающиеся с воскресенья, просто замените date("W", ...) на strftime("%U", ...) .

Вы можете использовать функцию ниже, полностью прокомментированную:

 /** * Returns the number of week in a month for the specified date. * * @param string $date * @return int */ function weekOfMonth($date) { // estract date parts list($y, $m, $d) = explode('-', date('Ym-d', strtotime($date))); // current week, min 1 $w = 1; // for each day since the start of the month for ($i = 1; $i <= $d; ++$i) { // if that day was a sunday and is not the first day of month if ($i > 1 && date('w', strtotime("$y-$m-$i")) == 0) { // increment current week ++$w; } } // now return return $w; } 

Корректный путь

 function weekOfMonth($date) { $firstOfMonth = date("Ym-01", strtotime($date)); return intval(date("W", strtotime($date))) - intval(date("W", strtotime($firstOfMonth))); } 

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

 function weekOfMonth($qDate) { $dt = strtotime($qDate); $day = date('j',$dt); $month = date('m',$dt); $year = date('Y',$dt); $totalDays = date('t',$dt); $weekCnt = 1; $retWeek = 0; for($i=1;$i<=$totalDays;$i++) { $curDay = date("N", mktime(0,0,0,$month,$i,$year)); if($curDay==7) { if($i==$day) { $retWeek = $weekCnt+1; } $weekCnt++; } else { if($i==$day) { $retWeek = $weekCnt; } } } return $retWeek; } 

 echo weekOfMonth('2015-09-08') // gives me 2; 
 function getWeekOfMonth(DateTime $date) { $firstDayOfMonth = new DateTime($date->format('Ym-1')); return ceil(($firstDayOfMonth->format('N') + $date->format('j') - 1) / 7); } 

Решение Goendg не работает для 2016-10-31.

Учитывая time_t wday (0 = воскресенье до 6 = суббота) первого числа месяца в firstWday , это возвращает номер недели (в воскресенье) в течение месяца:

 weekOfMonth = floor((dayOfMonth + firstWday - 1)/7) + 1 

Перевод на PHP:

 function weekOfMonth($dateString) { list($year, $month, $mday) = explode("-", $dateString); $firstWday = date("w",strtotime("$year-$month-1")); return floor(($mday + $firstWday - 1)/7) + 1; } 
 //It's easy, no need to use php function //Let's say your date is 2017-07-02 $Date = explode("-","2017-07-02"); $DateNo = $Date[2]; $WeekNo = $DateNo / 7; // devide it with 7 if(is_float($WeekNo) == true) { $WeekNo = ceil($WeekNo); //So answer will be 1 } //If value is not float then ,you got your answer directly