meses - diff php
Obtener intervalos de segundos entre dos datetime en PHP? (7)
Con los objetos DateTime, puede hacerlo así:
$date = new DateTime( ''2009-10-05 18:07:13'' );
$date2 = new DateTime( ''2009-10-05 18:11:08'' );
$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();
2009-10-05 18:11:08
2009-10-05 18:07:13
Esto debería generar 235, ¿cómo hacerlo?
Debido a las limitaciones de época de Unix, podría tener problemas para comparar fechas antes de 1970 y después de 2038. Elijo perder precisión (= no mirar el segundo) pero evitar pasar a través de las conversiones de época unix (getTimestamp). Depende de lo que estás haciendo ...
En mi caso, usando 365 en su lugar (12 * 30) y "30" como duración promedio del mes, redujo el error en una salida utilizable.
function DateIntervalToSec($start,$end){ // as datetime object returns difference in seconds
$diff = $end->diff($start);
$diff_sec = $diff->format(''%r'').( // prepend the sign - if negative, change it to R if you want the +, too
($diff->s)+ // seconds (no errors)
(60*($diff->i))+ // minutes (no errors)
(60*60*($diff->h))+ // hours (no errors)
(24*60*60*($diff->d))+ // days (no errors)
(30*24*60*60*($diff->m))+ // months (???)
(365*24*60*60*($diff->y)) // years (???)
);
return $diff_sec;
}
Tenga en cuenta que el error podría ser 0, si las cantidades "medias" están destinadas a diff. Los documentos PHP no hablan de esto ... En un caso grave, el error podría ser:
- 0 segundos si se aplica diff a las lagunas de tiempo <1 mes
- De 0 a 3 días si se aplica diff a las lagunas de tiempo> 1 mes
- De 0 a 14 días si se aplica diff a las lagunas de tiempo> 1 año
Prefiero suponer que alguien decidió considerar "m" como 30 días e "y" como 365, cargando "d" con la diferencia cuando "diff" camina a través de los meses no-30-días ...
Si alguien sabe algo más sobre esto y puede proporcionar documentación oficial, ¡es bienvenido!
La referencia de PHP Date Time es útil para cosas como esta: PHP Date Time Functions
strtotime() es probablemente la mejor manera.
$seconds = strtotime(''2009-10-05 18:11:08'') - strtotime(''2009-10-05 18:07:13'')
Puede usar strtotime() para hacer eso:
$diff = strtotime(''2009-10-05 18:11:08'') - strtotime(''2009-10-05 18:07:13'')
Un enfoque similar es posible con objetos DateTime, por ejemplo
$date = new DateTime( ''2009-10-05 18:07:13'' );
$date2 = new DateTime( ''2009-10-05 18:11:08'' );
$diff = $date2->getTimestamp() - $date->getTimestamp();
Si necesita la diferencia horaria local real y desea trabajar con getTimestamp
, debe tener en cuenta los conmutadores DST durante el período calculado. Por lo tanto, el desplazamiento local a UTC debe incluirse en la ecuación.
Tomemos, por ejemplo, las siguientes fechas:
$tz = new /DateTimeZone("Europe/Berlin");
$start = new /DateTime("2018-02-01 12:00:00", $tz);
$end = new /DateTime("2018-04-01 12:00:00", $tz);
$start
es "2018-02-01 11:00:00" en UTC, mientras que $end
es "2018-04-01 10:00:00" en UTC. Tenga en cuenta que, aunque la hora del día es la misma en la zona horaria de Berlín, es diferente en UTC. El desplazamiento UTC es de una hora en $start
y de 2 horas en $end
.
Tenga en cuenta que getTimestamp
siempre devuelve UTC. Por lo tanto, debe restar el desplazamiento de la marca de tiempo cuando busca la diferencia local real.
// WRONG! returns 5094000, one hour too much due to DST in the local TZ
echo $end->getTimestamp() - $start->getTimestamp();
// CORRECT: returns 5090400
echo ($end->getTimestamp() - $end->getOffset()) - ($start->getTimestamp() - $start->getOffset());
Una solución simple y exacta (ejemplificando el comentario de Nilz11):
$hiDate = new DateTime("2310-05-22 08:33:26");
$loDate = new DateTime("1910-11-03 13:00:01");
$diff = $hiDate->diff($loDate);
$secs = ((($diff->format("%a") * 24) + $diff->format("%H")) * 60 +
$diff->format("%i")) * 60 + $diff->format("%s");
strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")