Get week number in month from date in PHP? Get week number in month from date in PHP? arrays arrays

Get week number in month from date in PHP?


I think this relationship should be true and come in handy:

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

We also need to make sure that "overlapping" weeks from the previous year are handeled correctly - if January 1st is in week 52 or 53, it should be counted as week 0. In a similar fashion, if a day in December is in the first week of the next year, it should be counted as 53. (Previous versions of this answer failed to do this properly.)

<?phpfunction weekOfMonth($date) {    //Get the first day of the month.    $firstOfMonth = strtotime(date("Y-m-01", $date));    //Apply above formula.    return weekOfYear($date) - weekOfYear($firstOfMonth) + 1;}function weekOfYear($date) {    $weekOfYear = intval(date("W", $date));    if (date('n', $date) == "1" && $weekOfYear > 51) {        // It's the last week of the previos year.        return 0;    }    else if (date('n', $date) == "12" && $weekOfYear == 1) {        // It's the first week of the next year.        return 53;    }    else {        // It's a "normal" week.        return $weekOfYear;    }}// A few test cases.echo weekOfMonth(strtotime("2020-04-12")) . " "; // 2echo weekOfMonth(strtotime("2020-12-31")) . " "; // 5echo weekOfMonth(strtotime("2020-01-02")) . " "; // 1echo weekOfMonth(strtotime("2021-01-28")) . " "; // 5echo weekOfMonth(strtotime("2018-12-31")) . " "; // 6

To get weeks that starts with sunday, simply replace date("W", ...) with strftime("%U", ...).


You can use the function below, fully commented:

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


The corect way is

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