如何计算一年是否有53周

Mik*_*wis 5 php math week-number

根据每周每年的公式https://en.wikipedia.org/wiki/ISO_week_date,您应该能够找到每周53周的公式.我已经将公式复制到PHP中,但它似乎在2020年左右回归52周而不是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).") | ";
}
Run Code Online (Sandbox Code Playgroud)

来自维基百科

以下71年的400年周期有53周(371天); 未列出的年份有52周(364天); 当前年份增加2000:

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

我知道我可以使用date()函数获取给定年份的总周数,但我只是想知道是否有人知道数学,因为维基百科上的公式似乎是错误的.

编辑工作代码

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).") | ";
}
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 2

我可以看到两个问题:

\n\n
    \n
  1. 您错过了 公式中的向下表示法p。在 PHP 中应该是+ int($year / 4) - int($year / 100)etc,而不是+ ($year / 4) - ($year / 100)etc。

  2. \n
  3. p是一个函数,整体公式使用p(year)p(year - 1)。您$p等于p(year),但$p - 1等于p(year - 1)(请注意,您的第二个条件($p - 1) == 3与您的第一个条件相同,$p == 4\xe2\x80\x94 这应该表明这不是预期的)。最简单的解决方法是将其也写为 PHP 中的函数。

  4. \n
\n