2016-06-01 9 views
1

PHPで灰水曜日の日付を計算しようとしていますが、珍しい問題が発生しています。PHP:灰の数を計算するためにeaster_date()から日数を引く

アッシュ水曜日は、復活祭の前に46日です。

1日に秒があります。

46 * 86400 = 3974400

したがって、灰の水曜日は、3974400秒イースターの前にあります。

easter_date()は、現在の年の復活祭の真夜中のUnixタイムスタンプを返す組み込みのPHP関数です。 正しいある

date('F d, Y', easter_date())戻りMarch 27, 2016、。

今、これは物事が少し粘りと痒くなる場所です。その結果、

、1は右、そのdate('F d, Y', easter_date() - 3974400)戻りFebruary 10, 2016を想定でしょうか?

間違っています。

実際の結果は、灰の水曜日の前に1日ですFebruary 09, 2016、です。

これは、2016年がうるう年なのでしょうか?これはeaster_date()の既知の問題ですか?それとも、何か間違っているだけですか?

編集:私はPHPバージョン5.5.9-1ubuntu4.16を使用しています。こんにちはこのコードを試してみてください

+1

ITSはそのPHPのバージョンの問題のように思えます。私のシステムとうまく動作します。だから 'easter_date()'を使い、 'strtotime()'を使う方が良い – RJParikh

+0

うまく動作する:http://sandbox.onlinephpfunctions.com/code/90872fd92fa4b23ca3a2559bc8b136d2b5b85b5e – Justinas

+1

これは夏時間調整の可能性が高い。あなたの(サーバー)タイムゾーンでDSTのクロックが変わるのですか? '3974400'秒を減算すると、1日の時間数について非常に明示的な前提が設定されているため、夏時間が含まれる年に2回壊れるという仮定があります。 –

答えて

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>"; 
?> 
関連する問題