У меня есть массив случайных дат (не из 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 недель:
Я должен иметь возможность получить неделю 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