web-dev-qa-db-de.com

Erhalten Sie die Wochennummer im Monat ab Datum in PHP?

Ich habe ein Array von zufälligen Daten (die nicht aus MySQL stammen). Ich muss sie wöchentlich als Woche1, Woche2 usw. bis Woche5 gruppieren.

Was ich habe ist folgendes: 

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

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

Ich weiß, dass ich die Wochennummer erhalten kann, indem date('W',strtotime('2015-09-01')); aber diese Wochennummer ist die Nummer zwischen Jahr (1-52), aber ich brauche nur die Wochennummer des Monats, z. im september 2015 gibt es 5 wochen:

  • Woche 1 = 1. bis 5. 
  • Woche 2 = 6. bis 12.
  • Woche 3 = 13. bis 19.
  • Woche 4 = 20. bis 26.
  • Woche 5 = 27. bis 30.

Ich sollte in der Lage sein, die Woche Woche 1 zu erhalten, indem ich einfach das Datum angebe Z.

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

Ich denke, diese Beziehung sollte wahr (?) Sein und sich als nützlich erweisen:

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

In PHP implementiert, erhalten Sie Folgendes:

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

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

17
Anders

Sie können die Funktion unten verwenden, vollständig kommentiert:

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

Der richtige Weg ist 

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

Ich habe diese Funktion selbst erstellt, was scheinbar richtig funktioniert. Falls jemand anderes eine bessere Möglichkeit hat, dies zu tun, teilen Sie uns dies bitte mit.

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

Goendg-Lösung funktioniert nicht für 2016-10-31.

2
j4r3k

Sie können diese einfache Formel auch zum Suchen der Woche des Monats verwenden

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

ALGORITHMUS:

Datum = '2018-08-08' => Y-m-d

  1. Finden Sie den Tag des Monats heraus, z. 08
  2. Finden Sie heraus Numerische Darstellung des Wochentags minus 1 (Anzahl der Tage in der Woche), z. (3-1)
  3. Differenz nehmen und im Ergebnis speichern
  4. 1 vom Ergebnis abziehen 
  5. Teilen Sie es durch 7, um das Ergebnis zu erzielen
  6. Fügen Sie 1 hinzu, um z. 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') // gibt 3 zurück

1
Marlon Ingal

In Anbetracht der time_t wday (0 = Sonntag bis 6 = Samstag) des ersten Monats in firstWday wird die (sonntagsbasierte) Wochennummer innerhalb des Monats zurückgegeben:

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

In PHP übersetzt:

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

Meine Funktion. Die Hauptidee: Wir würden die Anzahl der Wochen zählen, die vom ersten bis zum aktuellen Datum des Monats vergangen sind. Und die aktuelle Wochennummer wäre die nächste. Funktioniert nach der Regel: "Woche beginnt ab Montag" (für sonntagsbasierten Typ müssen wir den aufsteigenden Algorithmus transformieren)

function GetWeekNumberOfMonth ($date){
    echo $date -> format('d.m.Y');
    //define current year, month and day in numeric
    $_year = $date -> format('Y');
    $_month = $date -> format('n');
    $_day = $date -> format('j');
    $_week = 0; //count of weeks passed
    for ($i = 1; $i < $_day; $i++){
        echo "\n\n-->";
        $_newDate = mktime(0,0,1, $_month, $i, $_year);
        echo "\n";
        echo date("d.m.Y", $_newDate);
        echo "-->";
        echo date("N", $_newDate);
        //on sunday increasing weeks passed count
        if (date("N", $_newDate) == 7){
            echo "New week";
            $_week += 1;
        }

    }
    return $_week + 1; // as we are counting only passed weeks the current one would be on one higher
}

$date = new DateTime("2019-04-08");
echo "\n\nResult: ". GetWeekNumberOfMonth($date);
1
Andrew Vasiliev

Es gibt viele Lösungen, aber hier ist eine meiner Lösungen, die in den meisten Fällen gut funktioniert.

function current_week ($date = NULL) {
    if($date) {
        if(is_numeric($date) && ctype_digit($date) && strtotime(date('Y-m-d H:i:s',$date)) === (int)$date)
            $unix_timestamp = $date;
        else
            $unix_timestamp = strtotime($date);
    } else $unix_timestamp = time();

    return (ceil((date('d', $unix_timestamp) - date('w', $unix_timestamp) - 1) / 7) + 1);
}

Es akzeptiert Unix-Zeitstempel, normales Datum oder gibt die aktuelle Woche von der Funktion time() zurück, wenn Sie keinen Wert übergeben.

Genießen!

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

Kurze Variante:

(int) (new \DateTime())->format('W') - (int) (new \DateTime('first day of this month'))->format('W') + 1;
0
dev-sl