Saltar al contenido
Codifíca.me | Desarrollo web | Programación

Sumar días hábiles con PHP

29 noviembre, 2019
php

En este script vamos a ver como sumar días hábiles a una fecha con PHP.

Este script es muy útil para las tiendas online y negocios así que tienen que calcular los tiempos de envío de los productos, y claro con una simple suma de días tienen el problema de encontrar días que no sean hábiles, lo cual retrasa considerablemente el envío y la recepción de los productos.

php fechas


Sumar días hábiles

En este caso el script para sumar días hábiles sería el siguiente:

 
function sumasdiasemana($fecha,$dias)
{
	$datestart= strtotime($fecha);
	$datesuma = 15 * 86400;
	$diasemana = date('N',$datestart);
	$totaldias = $diasemana+$dias;
	$findesemana = intval( $totaldias/5) *2 ; 
	$diasabado = $totaldias % 5 ; 
	if ($diasabado==6) $findesemana++;
	if ($diasabado==0) $findesemana=$findesemana-2;
 
	$total = (($dias+$findesemana) * 86400)+$datestart ; 
	return $fechafinal = date('Y-m-d', $total);
}
$sumarDias=1;
$entre1 = sumasdiasemana(date("Y-m-d"),$sumarDias);
echo $entre1 ;

Cómo puedes ver si cambias la variable $sumarDias por el número que quieras sumará x días hábiles a tu fecha.
En este caso la fecha inicial es la fecha actual que recuperamos con la función date.


Sumar días hábiles y formato de meses en Español

Cómo extra os añado está función que nos cambiará los meses a Español, y nos devolverá dos fechas , para poder conseguir la frase
“Recíbelo en tu casa entre fecha1 y fecha2”

Le sumamos inicialemente 1 día, y después para obtener la fecha final le sumamos otros 2 días (2 días + 1 inicial) , en total serían 3 días.

Y te mostrará la frase siguiente:

“Recíbelo en tu casa entre el día X1 mes Y1 , y el día X2 y mes Y2”

El código sería así:

 
function sumasdiasemana($fecha,$dias)
{
	$datestart= strtotime($fecha);
	$datesuma = 15 * 86400;
	$diasemana = date('N',$datestart);
	$totaldias = $diasemana+$dias;
	$findesemana = intval( $totaldias/5) *2 ; 
	$diasabado = $totaldias % 5 ; 
	if ($diasabado==6) $findesemana++;
	if ($diasabado==0) $findesemana=$findesemana-2;
 
	$total = (($dias+$findesemana) * 86400)+$datestart ; 
	return $twstart=date('Y-m-d', $total);
}
function mes($mes)
{
	if ($mes=="January") $mes="Enero";
	if ($mes=="February") $mes="Febrero";
	if ($mes=="March") $mes="Marzo";
	if ($mes=="April") $mes="Abril";
	if ($mes=="May") $mes="Mayo";
	if ($mes=="June") $mes="Junio";
	if ($mes=="July") $mes="Julio";
	if ($mes=="August") $mes="Agosto";
	if ($mes=="September") $mes="Setiembre";
	if ($mes=="October") $mes="Octubre";
	if ($mes=="November") $mes="Noviembre";
	if ($mes=="December") $mes="Diciembre";
	return $mes;
}
 
 
 
$date = date("Y-m-d-H");
 
$sumarDias=1;
 
$entre1 = sumasdiasemana(date("Y-m-d"),$sumarDias);
$entre1 =  date("d ",$entre1) . mes(date("F",$entre1)) . "\n";
 
 
$sumarDias= $sumarDias+2;
 
$entre2 = sumasdiasemana(date("Y-m-d"),$sumarDias);
 
$entre2 =  date("d ",$entre2) . mes(date("F",$entre2)) . "\n";
 
echo "<span style='color:blue;'>Recíbelo en tu casa entre el $entre1 y el $entre2</span>";

Sumar días hábiles a partir de una hora

Y finalmente os añado este código en el que si la hora del servidor es mayor que la hora que le he puesto entonces le añada un día más a ambos, ya que si la compra se realiza pasadas x horas no se podrá enviar ese día.

El código sería así:

function sumasdiasemana($fecha,$dias)
{
	$datestart= strtotime($fecha);
	$datesuma = 15 * 86400;
	$diasemana = date('N',$datestart);
	$totaldias = $diasemana+$dias;
	$findesemana = intval( $totaldias/5) *2 ; 
	$diasabado = $totaldias % 5 ; 
	if ($diasabado==6) $findesemana++;
	if ($diasabado==0) $findesemana=$findesemana-2;
 
	$total = (($dias+$findesemana) * 86400)+$datestart ; 
	return $twstart=date('Y-m-d', $total);
}
function mes($mes)
{
	if ($mes=="January") $mes="Enero";
	if ($mes=="February") $mes="Febrero";
	if ($mes=="March") $mes="Marzo";
	if ($mes=="April") $mes="Abril";
	if ($mes=="May") $mes="Mayo";
	if ($mes=="June") $mes="Junio";
	if ($mes=="July") $mes="Julio";
	if ($mes=="August") $mes="Agosto";
	if ($mes=="September") $mes="Setiembre";
	if ($mes=="October") $mes="Octubre";
	if ($mes=="November") $mes="Noviembre";
	if ($mes=="December") $mes="Diciembre";
	return $mes;
}
 
 
 
$date = date("Y-m-d-H");
$hora = date("H");
 
$sumarDias=1;
 
if ($hora>13){
  $sumarDias++;
}
$entre1 = sumasdiasemana(date("Y-m-d"),$sumarDias);
$entre1 =  date("d ",$entre1) . mes(date("F",$entre1)) . "\n";
//echo $entre1 ;
 
$sumarDias= $sumarDias+2;
 
$entre2 = sumasdiasemana(date("Y-m-d"),$sumarDias);
 
$entre2 =  date("d ",$entre2) . mes(date("F",$entre2)) . "\n";
 
echo "<span style='color:blue;'>Recíbelo en tu casa entre el $entre1 y el $entre2</span>";

Y listo, esto es todo , espero que te haya sido útil.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Comentarios (9)

Muchas gracias.

Responder

Buenas tardes, he probado el código y al realizar el conteo, no me cuadra los días. Mi interés es que a la fecha de registro del documento (ejemplo) se le sumen 15 días para responder, pero estos 15 días no deben incluir el día domingo y los festivos del año 2019 (por ahora), que cambios debo realizar. Muchas gracias.

Responder

Hola, muy bueno, cómo hago para que se tenga en cuenta el día sábado como hábil?

Responder

Estoy echándole un vistazo, pero ya no recuerdo bien como lo hice,
ummm , así por encima creo que si sustituyes
$findesemana = intval( $totaldias/5) *2 ;
por esto te valdría
$findesemana = intval( $totaldias/6) *2 ;

aunque tendrás que ajustar los días que quieres que se sumen después a tu “envío”

Responder

Buenas,
Los días que seas festivos tendrás que encontrar algo para tu pais con los dias festivos, desconozco si hay algo hecho en php que te valga.

Responder

Gracias

Responder

Para los dias festivos lo mejor es guardarlos en una tabla, para luego consultarlos y por medio de un contador sumarlos a la fecha final

Responder

saludos estoy probando tu codigo cambiando la variable date para colocar una fecha expecifica pero el conteo de los dias no cuadra por ningun lado sera que lo puedes documentar que hace que para entenderlo un poco mejor y hacer las correciones de los dias, estoy tratando e hacer un ejercicio en el que me cuente los años transcurridos entre dos fechas una vez tenga ese valor, dependiendo del valor me debe sumar desde una de las fechas anteriores los dias que me de ese valor pero solo sumar los dias en dias habiles.
ejemplo:
entrada: 01/01/2016
salida: 01/01/2019
el tiempo transcurrido entre las fechas sera de 2 años.
2 años es igual a 4 dias

fecha de salida 01/01/2019 + 15 dias (estos 15 dias es constante) + 4 dias ya que es lo que me da los 2 años
entonces en total seria que a la fecha 01/01/2019 se le deben contar 19 dias partiendo desde esa fecha pero habiles.

Responder

La forma mas fácil de de solucionar los días festivos, es guardándolos en una tabla, y luego con un ciclo for recorres las fecha inicial hasta la final y con un contador verificas cuantos días festivos salieron y luego sumas esa cantidad a la fecha final y listo tienes los días festivos incluidos.

Responder