php - 如何计算一年是否有53周

标签 php math week-number

根据公式https://en.wikipedia.org/wiki/ISO_week_dateWeeks per year 部分中,您应该能够找到每年有 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).") | ";
}

来自维基百科

The following 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

我知道我可以使用 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).") | ";
}

最佳答案

我能看到的两个问题:

  1. 您在 p 的公式中漏掉了 floor 符号。在 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 中也将其编写为一个函数。

关于php - 如何计算一年是否有53周,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45109650/

相关文章:

php - 我可以在谷歌应用引擎中运行 php mysql 吗

php - 从从 colorbox 打开的弹出窗口重新加载顶部窗口(在顶部窗口中)

math - 在三次样条插值中计算矩阵

css - M4 评估精度

crystal-reports - 更正 Crystal Reports XI 中的 ISO 周编号

php - 检查数组是否可以通过一次交换 2 个元素来排序

PHP Imagick setImageOpacity 破坏透明度什么都不做

math - 协助 Lua Cosine,返回错误结果

php - 有人能解释一下 date ("YW", strtotime ("2016-01-02"));返回 “201653” ?

excel - 获取从给定日期开始的月份中的第几周