Получить номер недели в месяц с даты в 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 недели:
- Week1 = с 1-го по 5-й
- Week2 = 6 по 12
- Week3 = 13-19
- Week4 = 20-26
- Week5 = 27th до 30th
Я должен иметь возможность получить неделю 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", ...)
.
вы можете использовать функцию ниже, полностью прокомментировал:
/**
* 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;
}
путь corect
function weekOfMonth($date) {
$firstOfMonth = date("Y-m-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('Y-m-1'));
return ceil(($firstDayOfMonth->format('N') + $date->format('j') - 1) / 7);
}
решение Goendg не работает для 2016-10-31.
учитывая время 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;
}
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
вы также можете использовать эту простую формулу для нахождения неделя месяца
$currentWeek = ceil((date("d",strtotime($today_date)) - date("w",strtotime($today_date)) - 1) / 7) + 1;
:
Date = '2018-08-08' = > Y-m-d
- выясните, день месяца, например. 08
- узнайте числовое представление дня недели минус 1 (Количество дней в неделе), например. (3-1)
- возьмите разницу и хранить в результате
- вычесть 1 из результата
- разделить на 7 для результата и ceil значение результата
- добавить 1 к результату, например. подшить(( 08 - 3 ) - 1 ) / 7) + 1 = 2
// self::DAYS_IN_WEEK = 7;
function getWeeksNumberOfMonth(): int
{
$currentDate = new \DateTime();
$dayNumberInMonth = (int) $currentDate->format('j');
$dayNumberInWeek = (int) $currentDate->format('N');
$dayNumberToLastSunday = $dayNumberInMonth - $dayNumberInWeek;
$daysCountInFirstWeek = $dayNumberToLastSunday % self::DAYS_IN_WEEK;
$weeksCountToLastSunday = ($dayNumberToLastSunday - $daysCountInFirstWeek) / self::DAYS_IN_WEEK;
$weeks = [];
array_push($weeks, $daysCountInFirstWeek);
for ($i = 0; $i < $weeksCountToLastSunday; $i++) {
array_push($weeks, self::DAYS_IN_WEEK);
}
array_push($weeks, $dayNumberInWeek);
if (array_sum($weeks) !== $dayNumberInMonth) {
throw new Exception('Logic is not valid');
}
return count($weeks);
}
короткий вариант:
(int) (new \DateTime())->format('W') - (int) (new \DateTime('first day of this month'))->format('W') + 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