
Los problemas con las fechas, son de lo más común a la hora de programar, añadir un día, restar días, comprobar si una fecha esta entre dos fechas.
Pero hoy vamos a hablar un poco más en profundidad y hablaremos de las horas de un día.
Porqué muchas veces trabajar con días es suficiente, pero a veces necesitamos tratar una franja horaria dentro de un día, para saber si pertenece esa franja al día anterior o al presente.
Así que vamos a ver como lo haríamos para ver si una fecha con hora se encuentra dentro de un rango de horas.
Función comprueba una hora entre un rango
A continuación os pongo la función que vamos a usar para ver si una hora se encuentra dentro de ese rango de horas que definamos.
1 2 3 4 5 6 7 8 | <?php function hourIsBetween($from, $to, $input) { $dateFrom = DateTime::createFromFormat('!H:i', $from); $dateTo = DateTime::createFromFormat('!H:i', $to); $dateInput = DateTime::createFromFormat('!H:i', $input); if ($dateFrom > $dateTo) $dateTo->modify('+1 day'); return ($dateFrom <= $dateInput && $dateInput <= $dateTo) || ($dateFrom <= $dateInput->modify('+1 day') && $dateInput <= $dateTo); } |
En la función lo que haremos será pasarle, el desde y el hasta del rango de horas que queremos que se encuentre y el datetime con la hora que nos llega.
Comprobaremos si la segunda hora que le pasamos es inferior a la primera, con lo cual entenderemos que es para el día siguiente.
Y al final devolveremos true o false dependiendo si el valor introducido se encuentra entre lo que le hemos pasado.
Ejemplo de llamada a la función
Este sería el código que podríamos usar para hacer la llamada a la función que hemos creado para comprobar el rango de horas.
1 2 3 4 5 6 7 8 9 | <?php $from = '22:00'; $to = '07:00'; $dateTest = new DateTime('midnight'); for ($a = 1; $a <= 10; $a++) { $input = $dateTest->format('H:i'); echo "$from <= $input <= $to -> " . (hourIsBetween($from, $to, $input) ? 'Yes' : 'No') . "\n"; $dateTest->modify("+1 hour"); } |
Aquí lo que hacemos es ir sumando una hora a partir de medianoche y comprobamos si esa hora que vamos sumando se encuentra dentro del rango de horas.
El resultado sería el siguiente:
1 2 3 4 5 6 7 8 9 10 | 22:00 <= 00:00 <= 07:00 -> Yes 22:00 <= 01:00 <= 07:00 -> Yes 22:00 <= 02:00 <= 07:00 -> Yes 22:00 <= 03:00 <= 07:00 -> Yes 22:00 <= 04:00 <= 07:00 -> Yes 22:00 <= 05:00 <= 07:00 -> Yes 22:00 <= 06:00 <= 07:00 -> Yes 22:00 <= 07:00 <= 07:00 -> Yes 22:00 <= 08:00 <= 07:00 -> No 22:00 <= 09:00 <= 07:00 -> No |
Como veis al final, las 8 y las 9 no cumplen la condición y por eso sale que no y el resto si que coincide.
Como veis simplemente necesitamos un datetime, con el que poder trabajar y ver si la hora se encuentra dentro del rango de horas.
Así podríamos comprobar si una fecha guardada en base de datos se encuentra entre la sesión de un día o la sesión de otro día, en el caso de que por ejemplo tengamos algún evento que ocurre entre un cierto rango de horas.
Si os interesa también podéis consultar el artículo sobre como restar o sumar horas, minutos o segundos en PHP.
Espero que os haya sido útil.
Y recordad! No olvidéis comentar! Vuestro código y en el blog 😉
paolo kusanovic
Hola puedes poner el codigo de lafuncion hourIsBetween(), como sabes si la hora esta dentro del rango ?
Oyagum
Hola paolo! No se si te he entendido bien. Creo que quieres que ponga la función hourIsBetween? La función está puesta en el post es el primer codigo que se ve. No se si es que no se ve bien o es otra cosa lo qud preguntas. Espero haberlo aclarado y sino dimelo y estaré encantado de ayudarte en lo que pueda.
Nelson
Hola OYAGUM,
Tengo php 5.4 en el servidor y me da Fatal error: Call to undefined method DateTime::createFromFormat()
No entiendo porque DateTime funciona desde PHP 5.3, no logro hacer funcionar la funcion.
Alguna ayuda? Gracias de antemano.
Nelson
Oyagum
Buenas Nelson,
Primero de todo darte las gracias por leerme y comentar.
He estado buscando información sobre lo que te pasa, pero es muy raro lo que me comentas la verdad :-/
He probado el código en la siguiente página:
http://sandbox.onlinephpfunctions.com/code/b50dbf04ffa6fa4cf01e32cfec49483c43939420
Ahí te deja escoger que versión de PHP usar, y en todas las versiones de 5.4 me ha funcionado correctamente, si puedes darme más información sobre el error, miro si puedo solucionarlo, pero ahora mismo me dejas a cuadros la verdad :-/
Karla
Hola mi duda es que tengo un sistema donde tengo que hacer las reservaciones esto me pordria ayudat igual para validar fecha y hora al mismo tiempo???
Me gustaria que el resultado de yes o no me lo guarde en una tabla para despues hacer la consulta
Oyagum
Auí la cosa sería hacer las dos comprobaciones, primero ver si está dentro de una fecha con horas libres y luego ver si esas horas escogidas estan libres o no. Almenos es como yo lo haría. Espero que te haya servido de ayuda 🙂 cualquier cosa, me dices 😉
Augusto
Hola gracias por tu aporte
no entendí el ejemplo;
Cuáles son los parámetros?
Cual es el dato imput?
A qué valor le sumas una hora? Al imput?
Saludos
Augusto
Ahetsav@gmail.com
Oyagum
Buenas Augusto,
Los parametros son from y to, osea desde tal hora hasta tal hora, y el input es la hora que introduces, osea, por ejemplo, alguien te pone las 09:00, ese es el input, y quieres saber si eso está dentro de franja horaria que fuera 08:00 hasta 22:00, 08:00 es el from y 22:00 es el to.
Así que la función lo que hace es coger el input, en este caso las 09:00 y comprueba que esa hora, este dentro de la franja de 08:00 hasta 22:00.
Y si le sumo una hora al input, porque es una demo y compruebo varias horas que esten dentro del margen que he puesto 🙂 simplemente es eso, un bucle para probar varias horas introducidas de forma automática.
Espero haberte podido ayudar, sino, cualquier cosa me dices.
Un saludo!
Darwin
Hola como puedo hacer que la variable $to esten incluidos
Ej.
hourIsBetween(’08:00′, ’12:00′, ’08:00′); //SI
hourIsBetween(’08:00′, ’12:00′, ’12:00′); //NO (aunque si esta pero quiero que para $to se pueda incluir)
Darwin
Ya logre solucionarlo!
Hola como puedo hacer que la variable $to esten incluidos
Ej.
hourIsBetween(’08:00′, ’12:00′, ’08:00′); //SI
hourIsBetween(’08:00′, ’12:00′, ’12:00′); //NO (aunque si esta pero quiero que para $to se pueda incluir)
Darwin
Hola muy buen aporte felicidades, ahora te lo pongo un poco mas difícil:
Que ahora la funcion pueda verificar si un rango de horas esta dentro de otro rango de hora, espero tu pronta respuesta, saludos.
function hourIsBetween($from, $to, $inputFrom, $inputTo) {
????
}