J'ai un tableau de dates aléatoires (ne venant pas de MySQL). Je dois les regrouper par semaine en semaine 1, semaine 2, etc. jusqu'à la semaine 5.
Ce que j'ai est ceci:
$dates = array('2015-09-01','2015-09-05','2015-09-06','2015-09-15','2015-09-17');
Ce dont j'ai besoin, c'est d'une fonction pour obtenir le numéro de semaine du mois en fournissant la date.
Je sais que je peux obtenir le numéro de semaine en faisant date('W',strtotime('2015-09-01'));
mais ce numéro de semaine est le nombre compris entre l'année (1-52) mais j'ai uniquement besoin du numéro de semaine du mois, par exemple en septembre 2015 il y a 5 semaines:
Je devrais pouvoir obtenir la semaine Week1 en fournissant simplement la date Par exemple.
$weekNumber = getWeekNumber('2015-09-01') //output 1;
$weekNumber = getWeekNumber('2015-09-17') //output 3;
Je pense que cette relation devrait être vraie (?) Et être utile:
Week of the month = Week of the year - Week of the year of first day of month + 1
Implémenté dans PHP, vous obtenez ceci:
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;
}
Pour obtenir des semaines commençant le dimanche, remplacez simplement les deux fonctions date("W", ...)
par strftime("%U", ...)
.
Vous pouvez utiliser la fonction ci-dessous, entièrement commentée:
/**
* 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;
}
La bonne façon est
function weekOfMonth($date) {
$firstOfMonth = date("Y-m-01", strtotime($date));
return intval(date("W", strtotime($date))) - intval(date("W", strtotime($firstOfMonth)));
}
J'ai créé cette fonction moi-même, qui semble fonctionner correctement. Si quelqu'un d'autre a un meilleur moyen de le faire, merci de le partager. Voici ce que j'ai fait.
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);
}
La solution Goendg ne fonctionne pas pour 2016-10-31.
Vous pouvez également utiliser cette formule simple pour trouver la semaine du mois
$currentWeek = ceil((date("d",strtotime($today_date)) - date("w",strtotime($today_date)) - 1) / 7) + 1;
ALGORITHME:
Date = '2018-08-08' => Y-m-d
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') // renvoie 3
Étant donné le time_t wday (0 = dimanche à 6 = samedi) du premier du mois dans firstWday
, ceci renvoie le numéro de semaine (basé sur le dimanche) dans le mois:
weekOfMonth = floor((dayOfMonth + firstWday - 1)/7) + 1
Traduit en PHP:
function weekOfMonth($dateString) {
list($year, $month, $mday) = explode("-", $dateString);
$firstWday = date("w",strtotime("$year-$month-1"));
return floor(($mday + $firstWday - 1)/7) + 1;
}
// 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);
}
Variante courte:
(int) (new \DateTime())->format('W') - (int) (new \DateTime('first day of this month'))->format('W') + 1;