PHP - Diferencia en calculo de días

 
Vista:
sin imagen de perfil
Val: 47
Ha aumentado su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

Diferencia en calculo de días

Publicado por Diego (37 intervenciones) el 13/02/2018 17:11:30
Buenas tardes. Necesito ayuda con algo muy sencillo pero que no puedo encontrar cuál es la diferencia.
El siguiente script calcula la diferencia entre dos fechas, pero al cambiar de mes el resultado no es el mismo, como verán el ejemplo 1 me da como resultado 4.95 cuando la diferencia es 5, )yo quiero calcular noches), como sí ocurre en el ejemplo 2.

Lo que no entiendo es por qué las fechas no son múltiplos de 86400, ya que el 9 de marzo de 2018 da como resultado 1520575200 que no es múltiplo y por eso me da en decimales.

La única solución es redondear ?

El bloque de código es el siguiente (en ambos ejemplos las fechas son del 9 al 14, de Marzo y de Febrero):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
//ejemplo 1
 
$desde='2018-03-09';
$hasta='2018-03-14';
 
$noches = (strtotime($hasta)-strtotime($desde))/86400;
echo $noches;
 
//resultado 4.95833333
 
echo "</br>"  ;
 
//ejemplo 2
 
$desde='2018-02-09';
$hasta='2018-02-14';
 
$noches = (strtotime($hasta)-strtotime($desde))/86400;
echo $noches;
 
//resultado 5
 
?>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 47
Ha aumentado su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

Diferencia en calculo de días

Publicado por Diego (37 intervenciones) el 13/02/2018 19:20:51
Ya encontré dónde está la diferencia.
STRTOTIME devuelve siempre un número decimal, con dos valores en su parte decimal diferentes. Los valores decimales son son 0.25 y 0.20833 según la fecha...por ejemplo vamos a hacer todo el 2018.
RESULTADOS DE STRTOTIME
del 01/01 al 12/03 da como resultado un numero cuya parte decimal es .25
del 13/03 al 05/11 da como resultado un numero cuya parte decimal es .2083333
del 06/11 al 31/12 vuelve a dar la parte decimal .25

Entonces cuando en el rango de fechas se encuentra una de las fechas donde cambian estos valores decimales (en Marzo...en Noviembre no me pasa lo mismo) se da la diferencia. Se puede comprobar con este ejemplo y en las variables $desde y $hasta si se carga un rango que incluya estos cambios da una diferencia.

Ejemplo:

Según las fechas me da 5 noches o 4 noches

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$desde='2018-03-01'; //luego probar con 2018-03-09
$hasta='2018-03-06'; //luego probar con 2018-03-14
 
$fecha1=strtotime($desde);
$fecha2=strtotime($hasta);
 
$fecha1=floor($fecha1);
$fecha2=floor($fecha2);
 
echo $fecha1;
echo "</br>";
echo $fecha2;
echo "</br>";
 
$noches = floor(($fecha2-$fecha1)/86400);
echo $noches;
?>

Espero le sirva a alguien.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Diferencia en calculo de días

Publicado por xve (6935 intervenciones) el 13/02/2018 20:05:56
Gracias por compartirlo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 47
Ha aumentado su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

Diferencia en calculo de días

Publicado por Diego (37 intervenciones) el 13/02/2018 20:20:45
De nada xve. Lo que no entiendo es por qué strtotime si "transforma" las fechas a un numero correspondiente a los segundos transcurridos iniciando el 01/01/1970 creo....da un número decimal al dividirlo por 86400....si todos los días tienen 86400 segundos. Por ende debería dar cualquier día un múltiplo de 86400. Estará relacionado con la zona horaria que tenga cargado el servidor? O sea que no "arranque" a las 0 horas siempre sino que tome por ejemolo +3 horas suponiendo que tengas ese uso horario?

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Diferencia en calculo de días

Publicado por xve (6935 intervenciones) el 14/02/2018 08:34:31
Hola Diego, strtotime como dices da los segundos desde el 1/1/70... por lo que si el strtotime te da el valor 86405 quiere decir que estamos en el 2/1/70 00:00:05. Por eso al dividirlo te dará decimales... es muy difícil que no haya decimales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 47
Ha aumentado su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

Diferencia en calculo de días

Publicado por Diego (37 intervenciones) el 14/02/2018 14:05:45
Buen día xve, gracias por tu respuesta. Creo haber encontrado la solución a mi problema. Como lo que yo necesito calcular son noches independientemente de los horarios usar strtotime no es lo mas adecuado. La solución sería esta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$fecha1='2018-03-19';
$fecha2='2018-03-14';
$formato='%a';
 
$noches=calculanoches($fecha1, $fecha2, $formato);
 
function calculanoches($fecha1 , $fecha2 , $formato)
{
    $datetime1 = date_create($fecha1);
    $datetime2 = date_create($fecha2);
    $intervalo = date_diff($datetime1, $datetime2);
     return $intervalo->format($formato);
}
 
echo $noches;
 
?>

Saludos !
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Diferencia en calculo de días

Publicado por xve (6935 intervenciones) el 14/02/2018 18:58:37
Muy buena solución Diego!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar