web-dev-qa-db-fra.com

Obtenir le numéro de semaine en mois à compter de la date en PHP?

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:

  • Semaine1 = 1er au 5ème 
  • Semaine2 = 6 au 12
  • Semaine3 = 13 au 19
  • Semaine4 = du 20 au 26
  • Semaine5 = 27 au 30

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;
10
Asif Hussain

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", ...).

17
Anders

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;
}
9
Matteo Tassinari

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)));
}
5
Goendg

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;
3
Asif Hussain
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.

2
j4r3k

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

  1. Découvrez le jour du mois, par exemple. 08
  2. Découvrez la représentation numérique du jour de la semaine moins 1 (nombre de jours dans la semaine), par exemple. (3-1)
  3. Prendre la différence et enregistrer le résultat
  4. Soustraire 1 du résultat 
  5. Diviser par 7 pour obtenir le résultat et limiter la valeur du résultat
  6. Ajouter 1 au résultat, par exemple. ceil ((08 - 3) - 1)/7) + 1 = 2
1
Ajay Tambe
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

1
Marlon Ingal

É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;
}
1
Mark Reed
// 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;
0
dev-sl