¿Existe alguna función incorporada en PHP que pueda calcular la cantidad de minutos de hora AM y PM en un intervalo de fecha y hora (trabajando con formato de 24 horas)? Digamos que tenemos:
$start_date = '2021-03-30 11:30:00';
$end_date = '2021-03-30 12:30:00';
Entonces generará:
$AM = 30;
$PM = 30;
Otro ejemplo:
$start_date = '2021-03-30 10:00:00';
$end_date = '2021-03-30 13:30:00';
Debería generar:
$AM = 120;
$PM = 90;
¿Esto responde a tu pregunta? ¿Cómo convertir la hora de AM/PM a formato de 24 horas en PHP?
- Gabriel
28/03/2021 a las 12:06
@Gabriel no, porque no estoy buscando convertir las fechas, solo necesito una diferencia de fecha y hora dividida en AM (en minutos) y PM (en minutos).
-bt19
28/03/2021 a las 12:08
investigue Carbon (carbon.nesbot.com/docs)
- Gabriel
28/03/2021 a las 12:15
@bt19¿La fecha de inicio y la fecha de finalización serán el mismo día? Si no, ¿cómo se verá el resultado?
-nice_dev
28/03/2021 a las 12:31
@Gabriel No es necesario instalar paquetes para tareas sencillas.
-nice_dev
28/03/2021 a las 12:33
------------------------------------
Cree objetos DateTime a partir de esas cadenas de fecha y cree manualmente un objeto de fecha y hora variable mid_noon. Encuentra la diferencia de ambos objetos con mid_noon usando FechaTime::diff y calcule el tiempo de diferencia en minutos como se muestra a continuación:
<?php
$start_date = DateTime::createFromFormat('Y-m-d H:i:s','2021-03-30 10:00:00');
$end_date = DateTime::createFromFormat('Y-m-d H:i:s','2021-03-30 13:30:00');
$mid_noon = DateTime::createFromFormat('Y-m-d H:i:s',$start_date->format('Y-m-d'). ' 12:00:00');
$start_diff = $mid_noon->diff($start_date);
$end_diff = $end_date->diff($mid_noon);
$am = $start_diff->h * 60 + $start_diff->i;
$pm = $end_diff->h * 60 + $end_diff->i;
echo $am," ",$pm;
3
@bt19 Solo una nota: la solución anterior supone que una fecha es anterior o igual al mediodía y la otra es posterior o igual al mediodía. Espero no estar especulando.
-nice_dev
28/03/2021 a las 13:00
Hola @nice_dev, en mi caso mi turno comienza de 6 p. m. a 2 a. m. pero tu código cuenta correctamente de 6 p. m. a 12 a. m. pero falla después de las 12 a. m., ¿tienes alguna solución?
- Hamza Qureshi
19 de abril de 2022 a las 22:28
@HamzaQureshi ¿Puedes publicar esto como una nueva pregunta?
-nice_dev
20/04/2022 a las 9:07
------------------------------------
Solución con strtotime y algo de sc elementalMatemáticas geniales.
$am = intdiv(43200 - strtotime('2021-03-30 10:00:00')%86400,60);
$pm = intdiv(strtotime('2021-03-30 13:30:00')%86400 - 43200,60);
strtotime proporciona los segundos desde el 01/01/1970. Con segundos%86400 obtenemos los segundos desde la medianoche. 86400 son los segundos de un día entero. 43200 son los segundos de medio día o las 12:00. Las diferencias 43200 - segundos de inicio y segundos de fin - 43200 nos dan los segundos para AM y PM. Sólo tenemos que dividir esto por 60 para obtener los minutos.
La siguiente variante con la extensión DateTime dt es más fácil de entender.
Dado:
$start_date = '2021-03-30 10:00:00';
$end_date = '2021-03-30 13:30:00';
Cálculo:
$day12h = dt::create($start_date)->setTime('12:00');
$am = dt::create($start_date)->diffTotal($day12h,'Minutes');
$pm = $day12h->diffTotal($end_date,'Minutes');
1
¿Qué pasa en mi caso con miEl turno comienza de 6 p.m. a 2 a.m. pero su código cuenta correctamente de 6 p.m. a 12 a.m. pero falla después de 12 a.m. a 2 a.m. ¿Tiene alguna solución?
- Hamza Qureshi
20 de abril de 2022 a las 0:13