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