total meses horas fechas entre días diferencia dias calcular años php datetime

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")