Primera pregunta. Sé gentil.Cortar un intervalo de tiempo en las partes
Estoy trabajando en un software que hace un seguimiento del tiempo que los técnicos pasan trabajando en tareas. El software debe ser mejorado para reconocer diferentes multiplicadores de tasas facturables en función del día de la semana y la hora del día. (Por ejemplo, "Tiempo y medio después de las 5 PM de lunes a viernes")
La tecnología que utiliza el software solo necesita registrar la fecha, hora de inicio y hora de finalización (en horas y minutos). Se espera que el software rompa la entrada de tiempo en partes en los límites de cuando cambian los multiplicadores de velocidad. No se permite que una entrada de una sola vez abarque varios días.
Aquí hay una muestra parcial de la tabla de tasas. Las teclas de matriz de primer nivel son los días de la semana, obviamente. Las teclas de matriz de segundo nivel representan la hora del día en que se activa el nuevo multiplicador y se ejecuta hasta la siguiente entrada secuencial en la matriz. Los valores de matriz son el multiplicador para ese rango de tiempo.
[rateTable] => Array
(
[Monday] => Array
(
[00:00:00] => 1.5
[08:00:00] => 1
[17:00:00] => 1.5
[23:59:59] => 1
)
[Tuesday] => Array
(
[00:00:00] => 1.5
[08:00:00] => 1
[17:00:00] => 1.5
[23:59:59] => 1
)
...
)
En la llanura Inglés, esto representa una tasa de hora y media desde la medianoche hasta las 8 am, la tasa regular de 8 a 5 de la tarde, y la hora y media de nuevo desde 5 hasta las 11: 59 p. M. El momento en que ocurren estos descansos puede ser arbitrario para el segundo y puede haber un número arbitrario de ellos para cada día. (Este formato es completamente negociable, pero mi objetivo es hacerlo lo más legible posible)
Como ejemplo: una entrada de tiempo registrada el lunes de 15:00:00 (3 PM) a 21:00:00 (9 PM) consistiría en 2 horas facturadas a 1x y 4 horas facturadas a 1.5x. También es posible que una entrada de una sola vez abarque varios descansos. Con el ejemplo de la tabla de tarifas anterior, una entrada de tiempo de 6 a.m. a 9 p.m. tendría 3 subvaciamientos de 6-8 a.m. a.m. 1.5x, de 8 a.m. a 5 p.m. a 1 a.m., y de a 5.9 a.m. a a.m. a 1.5x. Por el contrario, también es posible que una entrada de hora solo sea de 08:15:00 a 08:30:00 y que esté comprendida por completo en el rango de un solo multiplicador.
Realmente podría usar algo de ayuda para programar algunos PHP (o al menos idear un algoritmo) que puede tomar un día de la semana, una hora de inicio y una hora de finalización y analizar en las subpartes requeridas. Sería ideal que el resultado fuera una matriz que consta de entradas múltiples para un triplete (inicio, finalización, multiplicador). Para el ejemplo anterior, la salida sería:
[output] => Array
(
[0] => Array
(
[start] => 15:00:00
[stop] => 17:00:00
[multiplier] => 1
)
[1] => Array
(
[start] => 17:00:00
[stop] => 21:00:00
[multiplier] => 1.5
)
)
Yo simplemente no puedo hacerme a la lógica de la división de una sola (arranque, parada) en (potencialmente) múltiples subpartes.
+1 para una excelente descripción y redacción. – JYelton
+1 Bien, pedí una primera pregunta sobre SO. Dale algo de tiempo y algunas buenas respuestas vendrán. – webbiedave
¿Cuál es la forma más adecuada de combinar algunas de estas respuestas en lo que realmente terminé usando? ¿Debo publicar una respuesta yo mismo? Edita la pregunta? ¿Alguno de ellos vale la pena o la pregunta es tan útil como es sin una solución "final"? No quiero (potencialmente) retirar los votos de las personas que ** realmente ** resolvieron mi problema. – beporter