function calculate_date($holiday, &$holidays, $year, &$i) { // if($holiday['day'] == 0 && $holiday['dow'] != 0 && $holiday['occurence'] != 0) if ($holiday['day'] == 0 && $holiday['occurence'] != 0) { if ($holiday['occurence'] != 99) { $dow = phpgw_datetime::day_of_week($year, $holiday['month'], 1); $day = 7 * $holiday['occurence'] - 6 + ($holiday['dow'] + 7 - $dow) % 7; $day += $day < 1 ? 7 : 0; // What is the point of this? // Add 7 when the holiday falls on a Monday??? //$day += ($holiday['dow']==1 ? 7 : 0); // Sometimes the 5th occurance of a weekday (ie the 5th monday) // can spill over to the next month. This prevents that. $ld = phpgw_datetime::days_in_month($holiday['month'], $year); if ($day > $ld) { return; } } else { $ld = phpgw_datetime::days_in_month($holiday['month'], $year); $dow = phpgw_datetime::day_of_week($year, $holiday['month'], $ld); $day = $ld - ($dow + 7 - $holiday['dow']) % 7; } } else { $day = $holiday['day']; if ($holiday['observance_rule'] == True) { $dow = phpgw_datetime::day_of_week($year, $holiday['month'], $day); // This now calulates Observed holidays and creates a new entry for them. if ($dow == 0) { ++$i; $holidays[$i]['locale'] = $holiday['locale']; $holidays[$i]['name'] = $holiday['name'] . ' (Observed)'; $holidays[$i]['day'] = $holiday['day'] + 1; $holidays[$i]['month'] = $holiday['month']; $holidays[$i]['occurence'] = $holiday['occurence']; $holidays[$i]['dow'] = $holiday['dow']; $holidays[$i]['date'] = mktime(0, 0, 0, $holiday['month'], $day + 1, $year); $holidays[$i]['obervance_rule'] = 0; } else { if ($dow == 6) { ++$i; $holidays[$i]['locale'] = $holiday['locale']; $holidays[$i]['name'] = $holiday['name'] . ' (Observed)'; $holidays[$i]['day'] = $holiday['day'] - 1; $holidays[$i]['month'] = $holiday['month']; $holidays[$i]['occurence'] = $holiday['occurence']; $holidays[$i]['dow'] = $holiday['dow']; $holidays[$i]['date'] = mktime(0, 0, 0, $holiday['month'], $day - 1, $year); $holidays[$i]['obervance_rule'] = 0; } } } } $date = mktime(0, 0, 0, $holiday['month'], $day, $year); return $date; }
function calculate_date($holiday, &$holidays, $year, &$i) { static $cached_month; static $cached_day; static $cached_observance_rule; if ($holiday['day'] == 0 && $holiday['dow'] != 0 && $holiday['occurence'] != 0) { $dow = phpgw_datetime::day_of_week($year, $holiday['month'], 1); $dayshift = ($holiday['dow'] + 7 - $dow) % 7; $day = ($holiday['occurence'] - 1) * 7 + $dayshift + 1; // Happy monday law. if ($holiday['month'] == 1) { if ($year < 2000) { $day = 15; } } elseif ($holiday['month'] == 7) { if ($year < 2003) { $day = 20; } } elseif ($holiday['month'] == 9) { if ($year < 2003) { $day = 15; } } elseif ($holiday['month'] == 10) { if ($year < 2000) { $day = 10; } } } elseif ($holiday['day'] == 0 && $holiday['dow'] == 0 && $holiday['occurence'] == 0) { // For the next generation. // over 2151, please set $factor... if ($holiday['month'] == 3) { // for Vernal Equinox if ($year >= 1980 && $year <= 2099) { $factor = 20.8431; } elseif ($year >= 2100 && $year <= 2150) { $factor = 21.851; } } elseif ($holiday['month'] == 9) { // for Autumnal Equinox if ($year >= 1980 && $year <= 2099) { $factor = 23.2488; } elseif ($year >= 2100 && $year <= 2150) { $factor = 24.2488; } } $day = (int) ($factor + 0.242194 * ($year - 1980) - (int) (($year - 1980) / 4)); } else { // normal holiday $day = $holiday['day']; } if ($year >= 1985 && $holiday['month'] == $cached_month && $day == $cached_day + 2 && $cached_observance_rule == True && $holiday['observance_rule'] == True) { $pdow = phpgw_datetime::day_of_week($year, $holiday['month'], $day - 1); if ($pdow != 0) { $addcnt = count($holidays) + 1; $holidays[$addcnt]['locale'] = $holiday['locale']; if ($pdow == 1) { $holidays[$addcnt]['name'] = lang('overlap holiday'); } else { $holidays[$addcnt]['name'] = lang('people holiday'); } $holidays[$addcnt]['day'] = $day - 1; $holidays[$addcnt]['month'] = $holiday['month']; $holidays[$addcnt]['occurence'] = 0; $holidays[$addcnt]['dow'] = 0; $holidays[$addcnt]['date'] = mktime(0, 0, 0, $holiday['month'], $day - 1, $year); $holidays[$addcnt]['observance_rule'] = 0; } } $cached_month = $holiday['month']; $cached_day = $day; $cached_observance_rule = $holiday['observance_rule']; if ($year >= 1985 && $holiday['month'] == 5 && $day == 3) { } elseif ($holiday['observance_rule'] == True) { $dow = phpgw_datetime::day_of_week($year, $holiday['month'], $day); // This now calulates Observed holidays and creates a new entry for them. if ($dow == 0) { $addcnt = count($holidays) + 1; $holidays[$addcnt]['locale'] = $holiday['locale']; $holidays[$addcnt]['name'] = lang('overlap holiday'); $holidays[$addcnt]['day'] = $day + 1; $holidays[$addcnt]['month'] = $holiday['month']; $holidays[$addcnt]['occurence'] = $holiday['occurence']; $holidays[$addcnt]['dow'] = $holiday['dow']; $holidays[$addcnt]['date'] = mktime(0, 0, 0, $holiday['month'], $day + 1, $year); $holidays[$addcnt]['observance_rule'] = 0; } } $date = mktime(0, 0, 0, $holiday['month'], $day, $year); return $date; }
/** * */ public static function get_date($n_year, $n_month, $n_day, $date, $options = '') { if (is_array($date) && count($date) == 3) { list($year, $month, $day) = $date; } elseif (!$date) { $day = $month = $year = 0; } else { $day = date('d', $date); $month = date('m', $date); $year = date('Y', $date); } return phpgw_datetime::dateformatorder(self::getYears($n_year, $year), self::getMonthText($n_month, $month), self::getDays($n_day, $day)); }