diff --git a/src/Provider/AbstractEaster.php b/src/Provider/AbstractEaster.php index 2ffa45a..b3de8bb 100644 --- a/src/Provider/AbstractEaster.php +++ b/src/Provider/AbstractEaster.php @@ -7,18 +7,53 @@ */ abstract class AbstractEaster extends AbstractProvider { + /** + * Creating easter sunday + * + * @param $year + * @return \DateTime + */ + private function createSunday($year) + { + $easterSunday = new \DateTime('21.03.' . $year); + $easterSunday->modify(sprintf('+%d days', easter_days($year))); + + return $easterSunday; + } + + /** + * Creating Orthodox easter sunday + * + * @param $year + * @return \DateTime + */ + private function createOrthodoxSunday($year) + { + $a = $year % 4; + $b = $year % 7; + $c = $year % 19; + $d = (19 * $c + 15) % 30; + $e = (2 * $a + 4 * $b - $d + 34) % 7; + $month = floor(($d + $e + 114) / 31); + $day = (($d + $e + 114) % 31) + 1; + + $sunday = mktime(0, 0, 0, $month, $day + 13, $year); + + return new \DateTime(date('Y-m-d', $sunday)); + } /** * Returns all dates calculated by easter sunday * * @param int $year + * @param boolean $orthodox * * @return \DateTime[] */ - protected function getEasterDates($year) + protected function getEasterDates($year, $orthodox = false) { - $easterSunday = new \DateTime('21.03.'.$year); - $easterSunday->modify(sprintf('+%d days', easter_days($year))); + $easterSunday = $orthodox ? $this->createOrthodoxSunday($year) : $this->createSunday($year); + $easterSunday->setTimezone(new \DateTimeZone(date_default_timezone_get())); $easterMonday = clone $easterSunday; @@ -43,16 +78,16 @@ protected function getEasterDates($year) $corpusChristi->modify('+60 days'); return array( - 'maundyThursday' => $maundyThursday, - 'easterSunday' => $easterSunday, - 'easterMonday' => $easterMonday, - 'saturday' => $saturday, - 'goodFriday' => $goodFriday, - 'ascensionDay' => $ascensionDay, + 'maundyThursday' => $maundyThursday, + 'easterSunday' => $easterSunday, + 'easterMonday' => $easterMonday, + 'saturday' => $saturday, + 'goodFriday' => $goodFriday, + 'ascensionDay' => $ascensionDay, 'pentecostSaturday' => $pentecostSaturday, - 'pentecostSunday' => $pentecostSunday, - 'pentecostMonday' => $pentecostMonday, - 'corpusChristi' => $corpusChristi + 'pentecostSunday' => $pentecostSunday, + 'pentecostMonday' => $pentecostMonday, + 'corpusChristi' => $corpusChristi ); } diff --git a/src/Provider/RO.php b/src/Provider/RO.php index 2a32035..67a1714 100644 --- a/src/Provider/RO.php +++ b/src/Provider/RO.php @@ -20,7 +20,8 @@ class RO extends AbstractEaster */ public function getHolidaysByYear($year) { - $easter = $this->getEasterDates($year); + // make i + $easter = $this->getEasterDates($year, true); $holidays = array( '01-01' => $this->createData('Anul Nou'), @@ -35,6 +36,7 @@ public function getHolidaysByYear($year) '12-26' => $this->createData('Crăciunul'), // Easter dates + $easter['goodFriday']->format(self::DATE_FORMAT) => $this->createData('Paștele'), $easter['easterSunday']->format(self::DATE_FORMAT) => $this->createData('Paștele'), $easter['easterMonday']->format(self::DATE_FORMAT) => $this->createData('Paștele'), diff --git a/test/Provider/ROTest.php b/test/Provider/ROTest.php index ae66ea8..7863520 100644 --- a/test/Provider/ROTest.php +++ b/test/Provider/ROTest.php @@ -18,6 +18,8 @@ public function setUp() /** * Provides some test dates and the expectation * + * vendor/bin/phpunit --filter ROTest + * * @return array */ public function dateProvider() @@ -40,16 +42,18 @@ public function dateProvider() array('2018-12-26', null, array('name' => 'Crăciunul')), // Easter dates 2018 - array('2018-04-01', null, array('name' => 'Paștele')), - array('2018-04-02', null, array('name' => 'Paștele')), - array('2018-05-20', null, array('name' => 'Rusaliile')), - array('2018-05-21', null, array('name' => 'Rusaliile')), + array('2018-04-06', null, array('name' => 'Paștele')), + array('2018-04-08', null, array('name' => 'Paștele')), + array('2018-04-09', null, array('name' => 'Paștele')), + array('2018-05-27', null, array('name' => 'Rusaliile')), + array('2018-05-28', null, array('name' => 'Rusaliile')), // Easter dates 2019 - array('2019-04-21', null, array('name' => 'Paștele')), - array('2019-04-22', null, array('name' => 'Paștele')), - array('2019-06-09', null, array('name' => 'Rusaliile')), - array('2019-06-10', null, array('name' => 'Rusaliile')), + array('2019-04-26', null, array('name' => 'Paștele')), + array('2019-04-28', null, array('name' => 'Paștele')), + array('2019-04-29', null, array('name' => 'Paștele')), + array('2019-06-16', null, array('name' => 'Rusaliile')), + array('2019-06-17', null, array('name' => 'Rusaliile')), ); } }