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

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

Что у меня есть это:

$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
  • Неделя 2 = с 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;

10

Решение

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

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("Y-m-01", $date));
//Apply above formula.
return intval(date("W", $date)) - intval(date("W", $firstOfMonth)) + 1;
}

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

17

Другие решения

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

/**
* 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('Y-m-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;
}
9

Основной путь

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

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

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;
3
function getWeekOfMonth(DateTime $date) {
$firstDayOfMonth = new DateTime($date->format('Y-m-1'));

return ceil(($firstDayOfMonth->format('N') + $date->format('j') - 1) / 7);
}

Решение Гендга не работает на 2016-10-31.

2

Учитывая 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;
}
1
function weekOfMonth($strDate) {
$dateArray = explode("-", $strDate);
$date = new DateTime();
$date->setDate($dateArray[0], $dateArray[1], $dateArray[2]);
return floor((date_format($date, 'j') - 1) / 7) + 1;
}

weekOfMonth (‘2015-09-17’) // возвращает 3

1

Вы также можете использовать эту простую формулу для нахождения недели месяца

$currentWeek = ceil((date("d",strtotime($today_date)) - date("w",strtotime($today_date)) - 1) / 7) + 1;

АЛГОРИТМ:

Дата = ‘2018-08-08’ => Г-н-д

  1. Узнайте день месяца, например. 08
  2. Найти Числовое представление дня недели минус 1 (количество дней в неделе), например. (3-1)
  3. Возьмите разницу и сохраните результат
  4. Вычтите 1 из результата
  5. Разделите это на 7, чтобы привести к результату
  6. Добавьте 1 к результату, например. ceil ((08 — 3) — 1) / 7) + 1 = 2
1
По вопросам рекламы [email protected]