根据每年部分中的公式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).") | ";
}
答案 0 :(得分:2)
我可以看到两个问题:
您错过了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中的函数编写。
答案 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"));
}