Erhalten Sie die Wochennummer in Monat von Datum in PHP?

Ich habe eine Reihe von zufälligen Daten (nicht von MySQL). Ich muss sie nach Woche als Woche 1, Woche 2 usw. bis Woche 5 gruppieren.

Was ich habe ist das:

$dates = array('2015-09-01','2015-09-05','2015-09-06','2015-09-15','2015-09-17'); 

Was ich brauche, ist eine function, um die Wochennummer des Monats durch Angabe des Datums zu erhalten.

Ich weiß, dass ich die Wochennummer mit date('W',strtotime('2015-09-01')); aber diese Woche ist die Nummer zwischen Jahr (1-52), aber ich brauche nur die Wochennummer des Monats, zB im September 2015 sind es 5 Wochen:

  • Woche1 = 1. bis 5.
  • Woche2 = 6. bis 12.
  • Woche 3 = 13. bis 19.
  • Woche4 = 20. bis 26.
  • Woche 5 = 27. bis 30.

Ich sollte in der Lage sein, die Woche Week1 zu bekommen, indem ich nur das Datum zB zur Verfügung stelle

 $weekNumber = getWeekNumber('2015-09-01') //output 1; $weekNumber = getWeekNumber('2015-09-17') //output 3; 

    Ich denke, dass diese Beziehung wahr sein sollte (?) Und nützlich sein sollte:

     Week of the month = Week of the year - Week of the year of first day of month + 1 

    Implementiert in PHP bekommst du folgendes:

     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; } 

    Um Wochen zu bekommen, die mit Sonntag beginnen, ersetzen Sie einfach beide date("W", ...) durch strftime("%U", ...) .

    Sie können die folgende function vollständig kommentiert verwenden:

     /** * 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; } 

    Der richtige Weg ist

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

    Ich habe diese function selbst erstellt, die korrekt zu funktionieren scheint. Falls jemand anders eine bessere Möglichkeit hat, dies zu tun, bitte teilen .. Hier ist was ich getan habe.

     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 Lösung funktioniert nicht für 2016-10-31.

    Mit dem Wert time_t wday (0 = Sonntag bis 6 = Samstag) des ersten Monats im ersten firstWday wird die ( firstWday innerhalb des Monats zurückgegeben:

     weekOfMonth = floor((dayOfMonth + firstWday - 1)/7) + 1 

    Übersetzt in 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’) // gibt 3 zurück

    Sie können diese einfache Formel auch verwenden, um die Woche des Monats zu finden

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

    ALGORITHMUS:

    Datum = ‘2018-08-08’ => Jahr

    1. Finden Sie den Tag des Monats heraus z. 08
    2. Numerische Darstellung des Wochentags abzüglich 1 (Anzahl der Tage in der Woche) z. (3-1)
    3. Nimm den Unterschied und speichere das Ergebnis
    4. Subtrahiere 1 vom Ergebnis
    5. Teile es durch 7, um den Wert des Ergebnisses zu erhalten
    6. Add 1 zum Ergebnis z. ceil ((08 – 3) – 1) / 7) + 1 = 2
     //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