get working days for this month and exclude Greek holidays!

Costas

Administrator
Staff member
PHP has builtin function for find Catholic easter via easter_date() method, what about Orthodox Easter ?

JavaScript:
//call1
$x = new SimpleWorkingDays();
$days = $x->get_month_working_days(date('n'), date('Y'));  //for this month this year.

//call2
echo ""Holidays out of 22 : ";

$d_start= date("Y-01-01");
$d_end= date("Y-12-31");
$row_set=getSet($db, "select date_start, date_end from user_vacations where user_id=".$_SESSION['id']." and authorized=1 and date_end between '{$d_start}' and '{$d_end}'",null);
$count_working_days = 0;

foreach($row_set as $row) {
$count_working_days += $x->get_month_working_days_between_range($row["date_start"],$row["date_end"]);
}

echo $count_working_days. " days";?

////////////////////////
//////////////the class
////////////////////////
class SimpleWorkingDays
{
	//http://php.net/manual/fr/function.easter-date.php#83794
	private function orthodox_eastern($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; 
	    
	    $de = mktime(0, 0, 0, $month, $day + 13, $year); 
	    
	    return date('Y-m-d',$de); 
	} 

	private function get_vacation_days($year)
	{
		$vacations = array();
		$easter = $this->orthodox_eastern($year);
		$vacations[] = "01.01"; //prwtoxronia
		$vacations[] = "06.01"; //8eofaneia
		$vacations[] = "25.03"; //25march
		$vacations[] = "01.05"; //1may - ergatikh protomagia
		$vacations[] = "15.08"; //15aug - koimhsh 8eotokoy
		$vacations[] = "26.10"; //26oct - polioyxoy 8essalonikhs
		$vacations[] = "28.10"; //28oct - epeteios toy oxi
		$vacations[] = "25.12"; //25dec - christmas
		$vacations[] = "26.12"; //26dec - christmas - 2nd day - syna3is tis 8eotokoy
		$vacations[] = date('d.m',strtotime($easter)); //orthodox easter
		$vacations[] = date('d.m',strtotime($easter."-48 days")); //clean monday
		$vacations[] = date('d.m',strtotime($easter."-2 days")); //big friday
		$vacations[] = date('d.m',strtotime($easter."+50 days")); //agioy pneymatos
		$vacations[] = date('d.m',strtotime($easter."+1 days")); //monday pasxa
		
		return $vacations;
	}
		
	//get working days between range
	function get_month_working_days_between_range($date_one, $date_two)
	{
		$start = strtotime($date_one);
		$end = strtotime($date_two);
		
		$year = date("Y", $start); 
		
		$vacation_days = $this->get_vacation_days($year);
		

		
		$no_days=0;

		while ($start <= $end) {
			$get_name4vacation = date('d.m', $start);

			//when doesnt exist in vacation days			
			if (!in_array($get_name4vacation, $vacation_days)){
				$what_day = date("N", $start);
				
			    if($what_day < 6) // 6 and 7 are weekend days
			        $no_days++;
		    }
		    
		    $start += 86400; // +1 day
		}
		
		return $no_days;
	}
	//get working day in month
	function get_month_working_days($month, $year)
	{
		$day_count = cal_days_in_month(CAL_GREGORIAN, $month, $year); // builtin function - get amount of days
		$vacation_days = $this->get_vacation_days($year);
		
		$exclude=0;

		for ($i = 1; $i <= $day_count; $i++) {
				$get_name = date('D', strtotime($year.'/'.$month.'/'.$i)); //get day
			    $get_name4vacation = date('d.m', strtotime($year.'/'.$month.'/'.$i));
				
				if($get_name == 'Sun' || $get_name == 'Sat' || in_array($get_name4vacation, $vacation_days)){
					$exclude+=1;
				}
		}
		
		return ($day_count - $exclude);
	}
}
 
Top