如何计算一年是否有53周

时间:2017-07-14 18:35:15

标签: 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).") | ";
}

来自维基百科

  

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

     <00> 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).") | ";
}

3 个答案:

答案 0 :(得分:2)

我可以看到两个问题:

  1. 您错过了p公式中的楼层符号。在PHP中应该是+ int($year / 4) - int($year / 100)等而不是+ ($year / 4) - ($year / 100)

  2. p是一个函数,整体公式使用p(year)p(year - 1)。您的$p等于p(year),但$p - 1 等于p(year - 1)(请注意您的第二个条件($p - 1) == 3是与你的第一个条件$p == 4一样 - 这应该清楚表明那不是预期的。最简单的解决方法是将其作为PHP中的函数编写。

答案 1 :(得分:0)

您可以使用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");
    }
}

答案 2 :(得分:0)

不确定应用程序需要的“半周或四分之一周”,但这个小脚本将帮助您了解ISO周数的工作方式。今年的第一个ISO周从星期一开始。输出并不完全直观。 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"));
}