2016-06-01 38 views
1

我想用PHP計算Ash Wednesday的日期,但我遇到了一個不尋常的問題。PHP:從easter_date()中減去天數來計算Ash週三

灰色星期三在復活節前慶祝46天

還有一天秒。

46 * 86400 = 3974400

因此,灰星期三是3974400秒復活節之前。

easter_date()是一個內置的PHP函數,它返回當年復活節的午夜的Unix時間戳。

date('F d, Y', easter_date())回報March 27, 2016,這是正確的

現在...這是事情變得粘滯和噁心的地方。

其結果是,人們會認爲date('F d, Y', easter_date() - 3974400)回報February 10, 2016,對不對?

錯誤。

實際結果是February 09, 2016,這是灰燼星期三的前一天。

難道這是因爲2016年是閏年?這是easter_date()的某種已知問題嗎?或者我只是做錯了什麼?

編輯:我使用的PHP版本5.5.9-1ubuntu4.16備案。

+1

它看起來像它的PHP版本問題。它與我的系統很好地工作。所以不要使用'easter_date()'和更好地使用'strtotime()' – RJParikh

+0

Works罰款:http://sandbox.onlinephpfunctions.com/code/90872fd92fa4b23ca3a2559bc8b136d2b5b85b5e – Justinas

+1

它更可能是一個夏令時調整...什麼日期時鐘在您的(服務器)時區變化爲DST?因爲減去'3974400'秒對一天中的小時數做出了一些非常明確的假設,假設在涉及夏令時的情況下每年兩次都會中斷 –

回答

1

您好試試這個代碼,

<?php  
    // Determine the date of Easter for a given year. 
    function EasterDate($EasterYear) 
    { 
     $goldenNumber = fmod($EasterYear, 19) + 1;  
     if ($EasterYear <= 1752) 
     { 
      $dominicalNumber = fmod($EasterYear + ($EasterYear/4) + 5, 7); 
      $paschalFullMoon = fmod(3 - (11 * $goldenNumber) - 7, 30); 
     } 
     else 
     { 
      $dominicalNumber = fmod($EasterYear + ($EasterYear/4) - ($EasterYear/100) + ($EasterYear/400), 7); 
      $solarCorrection = ($EasterYear - 1600)/100 - ($EasterYear - 1600)/400; 
      $lunarCorrection = ((($EasterYear - 1400)/100) * 8)/25; 
      $paschalFullMoon = fmod(3 - 11 * $goldenNumber + $solarCorrection - $lunarCorrection, 30); 
     }  
     while ($dominicalNumber < 0) 
     { 
      $dominicalNumber += 7; 
     }  
     while ($paschalFullMoon < 0) 
     { 
      $paschalFullMoon += 30; 
     }  
     if ($paschalFullMoon == 29 || ($paschalFullMoon == 28 && $goldenNumber > 11)) 
     { 
      $paschalFullMoon--; 
     }  
     $difference = fmod(4 - $paschalFullMoon - $dominicalNumber, 7);  
     if ($difference < 0) 
     { 
      $difference += 7; 
     }  
     $dayEaster = $paschalFullMoon + $difference + 1;  
     if ($dayEaster < 11) 
     {    
      $EasterDate = mktime(0, 0, 0, 3, $dayEaster + 21, $EasterYear); 
     } 
     else 
     { 
      $EasterDate = mktime(0, 0, 0, 4, $dayEaster - 10, $EasterYear); 
     }  
     return $EasterDate; 
    } 
    // Requires EasterDate() 
    function dateAshWednesday($EasterYear) 
    { 
     $easter = getDate(EasterDate($EasterYear)); 
     return mktime(0, 0, 0, $easter['mon'], $easter['mday'] - 46, $easter['year']); 
    }  
    // Unit tests 
    $testYear = 2016; 
    echo "Ash Wednesday: " . date("j F Y", dateAshWednesday($testYear)) . "<br>"; 
    echo "Easter: " . date("j F Y", EasterDate($testYear)) . "<br>"; 
?>