【问题标题】:How to calculate if a year has 53 weeks如何计算一年是否有 53 周
【发布时间】:2017-07-14 18:35:15
【问题描述】:

根据每年的周数部分中的公式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).") | ";
}

来自维基百科

400 年周期中接下来的 71 年有 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).") | ";
}

【问题讨论】:

  • 没有一年有 53 周。
  • @JayBlanchard 所以 100 年有 36,400 天? :)
  • 周数和 ISO 周数可能不同。我想我只会查看一年中最后一天的 ISO 周数。
  • LOL @hobbs - 有 52 年和部分年份,但没有完整 53 周的年份。
  • @JayBlanchard 周一至周日可能没有 53 个“完整”周,但我需要考虑半周或四分之一周

标签: php math week-number


【解决方案1】:

我能看到的两个问题:

  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 与您的第一个条件 @987654332 相同@ — 这应该清楚地表明这不是预期的)。最简单的解决方法是也将其编写为 PHP 中的函数。

【讨论】:

  • 谢谢,我认为底数符号是方括号,我试图在不使用函数的情况下创建 p 函数,所以我有点搞砸了。
【解决方案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");
    }
}

【讨论】:

  • 感谢您的快速回复。我知道你可以使用内置函数或格式,但我只想知道数学来计算一年 53 周
  • @MikeLewis 我不确定追求是否值得花时间和精力。
【解决方案3】:

不确定应用程序在“半周或四分之一周”方面需要什么,但这个小脚本将帮助您了解 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"));
}

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 2023-03-13
    • 2013-02-02
    • 2023-03-29
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多