How to calculate whether a year has 53 weeks

According to the formula https://en.wikipedia.org/wiki/ISO_week_date in the Weeks per year section , you can find every year with 53 weeks. I copied the formula to PHP, but it looks like it got in the way in 2020, returning 52 weeks instead of 53.

function weeks($year){
    $w = 52;
    $p = ($year+($year/4)-($year/100)+($year/400))%7;
    if ($p == 4 || ($p-1) == 3){
        $w++;
    }
    return $w." ".$p;
}

for ($i = 2000; $i <= 2144; $i++) {
    echo $i." (".weeks($i).") | ";
}

From Wikipedia

The next 71 years in a 400-year cycle have 53 weeks (371 days); years not listed have 52 weeks (364 days); add 2000 for current years:

004, 009, 015, 020, 026, 032, 037, 043, 048, 054, 060, 065, 071, 076, 082, 088, 093, 099, 105, 111, 116, 122, 128, 133, 139, 144

I know that I can capture the total number of weeks for a given year using the date () function, but I'm just wondering if anyone knows the math, since the formula on Wikipedia seems to be wrong.

EDIT WORKING CODE

function p($year){
    return ($year+floor($year/4)-floor($year/100)+floor($year/400))%7;
}

function weeks($year){
    $w = 52;
    if (p($year) == 4 || p($year-1) == 3){
        $w++;
    }
    return $w; // returns the number of weeks in that year
}

for ($i = 2000; $i <= 2144; $i++) {
    echo $i." (".weeks($i).") | ";
}
+4
3

, :

  • p. PHP, + int($year / 4) - int($year / 100) .., + ($year / 4) - ($year / 100) ..

  • p - , p(year) p(year - 1). $p p(year), $p - 1 p(year - 1) ( , ($p - 1) == 3 , $p == 4 - , ). - PHP.

+2

strftime, .

for ($yr = 2000; $yr < 2144; ++$yr) {
    $weeks = (int) strftime("%U", strtotime("$yr-12-31 11:59"));
    if ($weeks === 53) {
        print("$yr has 53 weeks in it\n");
    }
}
0

Not sure if the application is required in terms of “half or quarter weeks,” but this little script will help you see how the ISO week numbers work. The first ISO week of the year starts on Monday. The output is not entirely intuitive. https://iconoun.com/demo/temp_mikelewis.php

<?php // demo/temp_mikelewis.php
/**
 * Dealing with ISO Week Numbers
 *
 * https://stackoverflow.com/questions/45109650/how-to-calculate-if-a-year-has-53-weeks
 */
error_reporting(E_ALL);
echo '<pre>';

for ($i = 2000; $i <= 2035; $i++)
{
    echo PHP_EOL . "YEAR $i: " . date('D W', strtotime("$i-12-31"));
}
Run codeHide result
0
source

Source: https://habr.com/ru/post/1681481/


All Articles