Necesito un método para agregar "días laborales" en PHP. Por ejemplo, viernes 12/5 + 3 días hábiles = miércoles 12/10.
Como mínimo, necesito el código para comprender los fines de semana, pero lo ideal es que también tenga en cuenta los feriados federales de EE. UU. Estoy seguro de que podría encontrar una solución mediante la fuerza bruta si fuera necesario, pero espero que haya un enfoque más elegante. ¿Nadie?
Gracias.
Respuestas:
Aquí hay una función de los comentarios del usuario en la página de funciones date () en el manual de PHP. Es una mejora de una función anterior en los comentarios que agrega soporte para años bisiestos.
Ingrese las fechas de inicio y finalización, junto con una matriz de días festivos que podrían estar en el medio, y devuelve los días hábiles como un número entero:
fuente
Obtenga el número de días laborables sin festivos entre dos fechas:
Ejemplo de uso:
Salida:
Función:
fuente
$interval = DateInterval::createFromFormat('1 weekday');
también recomiendo usar$holidays = array_flip($holidays);
antes de foreach yif isset($holidays[$period->format('Y-m-d')]);
reducir la cantidad de tiempo de procesamiento necesario por iteración. Pero recomiende crear una función personalizada para las vacaciones para poder procesar las vacaciones relativas, comolast thursday of november
el día de acción de gracias o el día del trabajofirst monday of september
Hay algunos argumentos para la función date () que deberían ayudar. Si marca la fecha ("w"), le dará un número para el día de la semana, desde 0 para el domingo hasta 6 para el sábado. Entonces ... tal vez algo como ...
Este es solo un ejemplo aproximado de una posibilidad.
fuente
El cálculo de vacaciones no es estándar en cada estado. Estoy escribiendo una solicitud bancaria para la que necesito algunas reglas comerciales estrictas, pero aún así solo puedo obtener un estándar aproximado.
fuente
fuente
Aquí hay una función para agregar días de negocios a una fecha.
Otra publicación menciona getWorkingDays (de los comentarios de php.net e incluidos aquí) pero creo que se rompe si comienzas un domingo y terminas un día laboral.
Usando lo siguiente (deberá incluir la función getWorkingDays de la publicación anterior)
Da el resultado como 5, no 4
La siguiente función se utilizó para generar lo anterior.
Que vengan las vacaciones ...
fuente
Puede probar esta función que es más simple.
fuente
Una función para sumar o restar días hábiles de una fecha determinada, esto no tiene en cuenta los días festivos.
usar así ...
fuente
Mi versión basada en el trabajo de @mcgrailm ... modificada porque el informe tenía que ser revisado dentro de los 3 días hábiles, y si se enviaba un fin de semana, el conteo comenzaría el lunes siguiente:
Y calculando la diferencia de dos fechas en términos de días hábiles:
Como nota, todos los que están usando 86400, o 24 * 60 * 60, por favor no ... su hora de olvido cambia de invierno / verano, donde un día no es exactamente 24 horas. Si bien es un poco más lento el strtotime ('+ 1 día', $ timestamp), es mucho más confiable.
fuente
Intento brutal de detectar el tiempo de trabajo: de lunes a viernes de 8 a.m. a 4 p.m.
fuente
A continuación se muestra el código de trabajo para calcular los días hábiles a partir de una fecha determinada.
fuente
Aquí hay otra solución sin bucle for para cada día.
fuente
Para las vacaciones, cree una matriz de días en algún formato que pueda producir date (). Ejemplo:
Luego use las funciones in_array () y date () para verificar si la marca de tiempo representa un día festivo:
fuente
Tenía esta misma necesidad, comencé con el primer ejemplo de Bobbin y terminé con esto
hth alguien
fuente
!in_array($enddate,$holidays)
a!in_array(date('Y-m-d',$enddate),$holidays)
si se utiliza una matriz de vacaciones aprobada en como Bobinas -$holidays=array('2013-06-16','2013-07-12','2013-08-05');
De lo contrario se está comprobando una gama completa de fechas para una marca de tiempo, que siempre devuelve falso.Variante 1:
Variante 2:
Variante 3:
Las consideraciones de vacaciones adicionales se pueden realizar utilizando variaciones de lo anterior haciendo lo siguiente. ¡Nota! asegúrese de que todas las marcas de tiempo sean a la misma hora del día (es decir, medianoche).
Haga una serie de fechas de vacaciones (como unixtimestamps), es decir:
Modificar línea:
ser - estar :
¡Hecho!
fuente
fuente
Aquí hay una solución recursiva. Se puede modificar fácilmente para realizar un seguimiento y devolver la última fecha.
fuente
fuente
fuente
calcular los días laborables entre dos fechas, incluidas las vacaciones y la semana laboral personalizada
La respuesta no es tan trivial; por lo tanto, mi sugerencia sería usar una clase en la que pueda configurar más que confiar en una función simplista (o asumir una configuración regional y una cultura fijas). Para obtener la fecha después de una determinada cantidad de días laborables:
Enfoque funcional
fuente
Esta es otra solución, es casi un 25% más rápida que comprobar las vacaciones con in_array:
fuente
Este fragmento de código es muy fácil de calcular el día laborable sin fines de semana ni festivos:
fuente
Sé que llego tarde a la fiesta, pero utilizo este antiguo conjunto de funciones de Marcos J. Montes para calcular los días festivos y laborales. Se tomó el tiempo para agregar un algoritmo de 1876 para la Pascua y agregó todas las principales festividades de EE. UU. Esto se puede actualizar fácilmente para otros países.
fuente
function get_business_days_forward_from_date ($ num_days, $ start_date = '', $ rtn_fmt = 'Ym-d') {
}
fuente
El add_business_days tiene un pequeño error. Intente lo siguiente con la función existente y la salida será un sábado.
Fecha de inicio = Viernes Días hábiles para agregar = 1 Matriz de vacaciones = Agregar fecha para el lunes siguiente.
Lo he arreglado en mi función a continuación.
fuente
Acabo de hacer que mi función funcione según el código Bobbin y mcgrailm, agregando algunas cosas que funcionaron perfectamente para mí.
fuente
Una mejora de la función ofrecida por James Pasta arriba, para incluir todos los días festivos federales y para corregir el 4 de julio (¡se calculó como el 4 de junio arriba!), Y para incluir también el nombre del día festivo como clave de matriz ...
/ **
* Días festivos nacionales estadounidenses
* @param string $ year
* @return array
* /
public static function getNationalAmericanHolidays ($ year) {
}
fuente
Acabo de terminar de escribir una API que se puede usar para manipular los días hábiles (ninguna de estas soluciones funcionó del todo para mi situación :-); vinculándolo aquí en caso de que alguien más lo encuentre útil.
~ Nate
Clase PHP para calcular días laborales
fuente
Gracias a Bobbin, mcgrailm, Tony, James Pasta y algunos otros que publicaron aquí. Escribí mi propia función para agregar días hábiles a una fecha, pero la modifiqué con un código que encontré aquí. Esto manejará que la fecha de inicio sea un fin de semana / feriado. Esto también manejará el horario comercial. Agregué algunos comentarios y desglosé el código para que sea más fácil de leer.
fuente
Personalmente, creo que esta es una solución más limpia y concisa:
Simplemente envíe la
new
fecha propuesta a esta función.fuente