如何计算一年是否有53周
How to calculate if a year has 53 weeks
根据 每年周数 部分中的公式 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).") | ";
}
来自维基百科
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).") | ";
}
您可以使用 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");
}
}
我看到的两个问题:
您在 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 中的函数。
不确定应用程序在 "half or quarter weeks" 方面需要什么,但这个小脚本将帮助您了解 ISO 周数的工作方式。一年中的第一个 ISO 周从星期一开始。输出并不完全直观。
https://iconoun.com/demo/temp_mikelewis.php
<?php // demo/temp_mikelewis.php
/**
* Dealing with ISO Week Numbers
*
*
*/
error_reporting(E_ALL);
echo '<pre>';
for ($i = 2000; $i <= 2035; $i++)
{
echo PHP_EOL . "YEAR $i: " . date('D W', strtotime("$i-12-31"));
}
根据 每年周数 部分中的公式 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).") | ";
}
来自维基百科
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).") | ";
}
您可以使用 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");
}
}
我看到的两个问题:
您在
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 中的函数。
不确定应用程序在 "half or quarter weeks" 方面需要什么,但这个小脚本将帮助您了解 ISO 周数的工作方式。一年中的第一个 ISO 周从星期一开始。输出并不完全直观。 https://iconoun.com/demo/temp_mikelewis.php
<?php // demo/temp_mikelewis.php
/**
* Dealing with ISO Week Numbers
*
*
*/
error_reporting(E_ALL);
echo '<pre>';
for ($i = 2000; $i <= 2035; $i++)
{
echo PHP_EOL . "YEAR $i: " . date('D W', strtotime("$i-12-31"));
}