-
- /**
- * Compute eastern for selected year
- *
- * @param int $year The eastern year
- *
- * @return DateTime The eastern date
- */
- function getEastern($year) {
- //Set static
- static $data = null;
- //Check if already computed
- if (isset($data[$year])) {
- //Return computed eastern
- return $data[$year];
- //Check if data is null
- } elseif (is_null($data)) {
- //Init data array
- $data = [];
- }
- $d = (19 * ($year % 19) + 24) % 30;
- $e = (2 * ($year % 4) + 4 * ($year % 7) + 6 * $d + 5) % 7;
-
- $day = 22 + $d + $e;
- $month = 3;
-
- if ($day > 31) {
- $day = $d + $e - 9;
- $month = 4;
- } elseif ($d == 29 && $e == 6) {
- $day = 10;
- $month = 4;
- } elseif ($d == 28 && $e == 6) {
- $day = 18;
- $month = 4;
- }
-
- //Store eastern in data
- return ($data[$year] = new \DateTime(sprintf('%04d-%02d-%02d', $year, $month, $day)));
- }
-
- /**
- * Check if date is a premium day
- *
- * @desc Consider as premium a day off
- *
- * @param DateTime $date The date to check
- * @return bool Whether the date is off or not
- */
- function isPremium($date) {
- //Get day number
- $w = $date->format('w');
-
- //Check if weekend day
- if ($w == 0 || $w == 6) {
- //Date is weekend day
- return true;
- }
-
- //Get date day
- $d = $date->format('d');
-
- //Get date month
- $m = $date->format('m');
-
- //Check if fixed holiday
- if (
- //Check if 1st january
- ($d == 1 && $m == 1) ||
- //Check if 1st may
- ($d == 1 && $m == 5) ||
- //Check if 8st may
- ($d == 8 && $m == 5) ||
- //Check if 14st july
- ($d == 14 && $m == 7) ||
- //Check if 15st august
- ($d == 15 && $m == 8) ||
- //Check if 1st november
- ($d == 1 && $m == 11) ||
- //Check if 11st november
- ($d == 11 && $m == 11) ||
- //Check if 25st december
- ($d == 25 && $m == 12)
- ) {
- //Date is a fixed holiday
- return true;
- }
-
- //Get eastern
- $eastern = $this->getEastern($date->format('Y'));
-
- //Check dynamic holidays
- if (
- (clone $eastern)->add(new \DateInterval('P1D')) == $date ||
- (clone $eastern)->add(new \DateInterval('P39D')) == $date ||
- (clone $eastern)->add(new \DateInterval('P50D')) == $date
- ) {
- //Date is a dynamic holiday
- return true;
- }
-
- //Date is not a holiday and week day
- return false;
- }