1

Clase para calcular días festivos PHP

Este POST es para realizar un cálculo de días feriados o no hábiles, cabe destacar que soy Venezolano por lo tanto los días pueden variar.

<?php 
class Funciones {

	public const EXPLIMPIARIDFISCAL = [ '/[^0-9 -]/', '/[ -]+/', '/^-|-$/' ];

	public static $diasFeriados = [
													'01-01', //Año nuevo
													'04-19', //Declaración de la Independencia,
													'05-01', //Día del trabajador
													'06-24', //Batalla de Carabobo
													'07-05', //Día de la independencia
													'07-24', //Natalicio de Simón Bolívar
													'10-12', //Día de la Resistencia Indígena
													'12-24', //Víspera de Navidad
													'12-25', //Navidad
													'12-31', //Fiesta de Fin de Año
												 ];
	
	/**
	 * [formatearFecha Formatea la fecha Y-m-d]
	 * @param  [string] $fecha [description]
	 * @return [string]        [description]
	 */
	public static function formatearFecha($fecha) {

		if ( strpos($fecha, '/') ) {

			$fechaArray = explode('/', $fecha);

			$dia  = $fechaArray[0];
			$mes  = $fechaArray[1];
			$year = $fechaArray[2];

			$fecha = $year . '-' . $mes . '-' . $dia;

		}

		return $fecha;

	}

	/**
	 * [diferenciaEntreFechas Obtiene la diferencia entre 2 fechas]
	 * @param  [string] $fechaInicial    [description]
	 * @param  [string] $fechaFinal      [description]
	 * @param  string $formatoDiferencia [ % = Literal %; %
	 *                                   	 Y = Años, numérico, al menos 2 dígitos empezando con 0; 01, 03
	 *                                   	 y = Años, numérico; 1, 3
	 *                                   	 M = Meses, numérico, al menos 2 dígitos empezando con 0; 01, 03, 12
	 *                                   	 m = Meses, numérico; 1, 3, 12
	 *                                   	 D = Días, numérico, al menos 2 dígitos empezando con 0; 01, 03, 31
	 *                                   	 d = Días, numérico; 1, 3, 31
	 *                                   	 a = Número total de días como resultado de una operación con DateTime::diff(), o de lo contrario (unknown); 4, 18, 8123
	 *                                   	 H = Horas, numérico, al menos 2 dígitos empezando con 0; 01, 03, 23
	 *                                   	 h = Horas, numérico; 1, 3, 23
	 *                                   	 I = Minutos, numérico, al menos 2 dígitos empezando con 0; 01, 03, 59
	 *                                   	 i = Minutos, numérico; 1, 3, 59
	 *                                   	 S = Segundos, numérico, al menos 2 dígitos empezando con 0; 01, 03, 57
	 *                                   	 s = Segundos, numérico; 1, 3, 57
	 *                                   	 R = Signo "-" cuando es negativo, "+" cuando es positivo; -, +
	 *                                   	 r = Signo "-" cuando es negativo, vacío cuando es positivo; - ]
	 * @return [string]                  [description]
	 */
	public static function diferenciaEntreFechas($fechaInicial, $fechaFinal, $formatoDiferencia = 'a') {

		$fechaInicial = new \DateTime( self::formatearFecha($fechaInicial) );
		$fechaFinal   = new \DateTime( self::formatearFecha($fechaFinal) );

		//Diferencia de fechas y formato
		return $fechaInicial->diff($fechaFinal)->format("%$formatoDiferencia%");

	}

	/**
	 * [contarDiasNoHabiles Cuenta los días NO hábiles entre 2 fechas]
	 * @param  [string] $fechaInicial [description]
	 * @param  [string] $fechaFinal   [description]
	 * @return [array]  $arrayDias    [Número de días No hábiles (Sábados y Domingos)]
	 */
	public static function contarDiasNoHabiles($fechaInicial, $fechaFinal/*, $fechaHoy*/) {

		//Contadores de días
		$feriados = 0;
		$sabados  = 0;
		$domingos = 0;

		$msg          = '';
		$diasFeriados = [];

		$fechaInicial = new \DateTime( self::formatearFecha($fechaInicial) );
		$fechaFinal   = new \DateTime( self::formatearFecha($fechaFinal) );

		while ( $fechaInicial <= $fechaFinal ) {

			( $fechaInicial->format('l') === 'Saturday' ) ? $sabados++  : $sabados  += 0;
			( $fechaInicial->format('l') === 'Sunday' )   ? $domingos++ : $domingos += 0;

			//Si está en el array y es sábado o domingo (Se restan esos días)
			if ( in_array($fechaInicial->format('m-d'), self::$diasFeriados ) ) {

				$feriados++;

				if ( $fechaInicial->format('l') === 'Saturday' ) {
					$sabados--;
					$msg .= '* El sábado ' . $fechaInicial->format('Y-m-d') . ' fue feriado ';
				}

				if ( $fechaInicial->format('l') === 'Sunday' ) {
					$domingos--;
					$msg .= '* El domingo ' . $fechaInicial->format('Y-m-d') . ' fue feriado ';
				}

				array_push($diasFeriados, $fechaInicial->format('Y-m-d'));

			}

			$fechaInicial->modify('+1 days'); //Incremento de la fecha inicial

		}

		return $arrayDias = ['feriados'     => (int)$feriados,
												 'sabados'      => (int)$sabados, 
												 'domingos'     => (int)$domingos,
												 'totalDias'    => (int)($feriados + $sabados + $domingos),
												 'diasFeriados' => [$diasFeriados],
												 'msg'          => $msg];

	}

}

var_dump(Funciones::contarDiasNoHabiles('01/01/2017', '31/12/2017'));

?>
Escribe tu comentario
+ 2