Calcular minutos en un intervalo de fechas Minutos AM Minutos PM en PHP

CorePress2024-01-25  11

¿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

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare