2017-07-14 697 views
3

根據公式https://en.wikipedia.org/wiki/ISO_week_date每週部分您應該能夠找到每年53周。我抄公式爲PHP,但它似乎亂了2020年左右返回52周而不是53如何計算一年是否有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:

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

有53個星期。 –

+1

@JayBlanchard所以100年後有36,400天? :) – hobbs

+0

週數和ISO週數可能是不同的事情。我想我只會看一年中最後一天的ISO週數。 –

回答

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中的函數編寫。

+0

謝謝我以爲地板符號是一個方括號,我試圖在不使用函數的情況下製作p函數,所以我有點讓自己陷入了困境。 –

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"); 
    } 
} 
+0

感謝您的快速回復。我知道你可以使用內置的函數或格式,但我只想知道計算一個53周的年數 –

+0

@MikeLewis我不確定這種追求是否值得花時間和精力。 – amphetamachine

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