2011-03-22 16 views
21

Necesito obtener el número de años a partir de 2 fechas proporcionadas. Aquí está mi código:Cálculo del número de años entre 2 fechas en PHP

function daysDifference($endDate, $beginDate) 
{ 
    $date_parts1=explode("-", $beginDate); 
    $date_parts2=explode("-", $endDate); 

    $start_date=gregoriantojd($date_parts1[1], $date_parts1[2], $date_parts1[0]); 
    $end_date=gregoriantojd($date_parts2[1], $date_parts2[2], $date_parts2[0]); 
    $diff = $end_date - $start_date; 
    echo $diff; 
    $years = floor($diff/(365.25*60*60*24)); 
    return $years; 
} 

echo daysDifference('2011-03-12','2008-03-09'); 

El $diff da una salida numérica. Cuando regreso $years, obtengo 0. ¿Qué he hecho mal?

+0

Por favor, busque antes de publicar. [¿Cómo calcular la diferencia entre dos fechas usando PHP?] (Http://stackoverflow.com/questions/676824/how-to-calculate-the-difference-between-two-dates-using-php) –

+0

@Hans: Gracias Hans – Deepak

+0

Es posible que desee aclarar lo que está buscando. Su función se llama 'daysDifference' y devuelve' $ years' y usa 'gregoriantojd'. – Matthew

Respuesta

-2

Si desea que el número de años entre dos fechas, ¿por qué no usar lo siguiente:

function yearsDifference($endDate, $beginDate) 
{ 
    $date_parts1=explode("-", $beginDate); 
    $date_parts2=explode("-", $endDate); 
    return $date_parts2[0] - $date_parts1[0]; 
} 

echo yearsDifference('2011-03-12','2008-03-09'); 

que, en este caso, le conseguirá:

3 
+0

él quiere la diferencia en Julian Day – diEcho

+0

Esto puede no dar el resultado esperado. ¿Qué hay del 31 de diciembre frente al 1 de enero? No creo que deba ser un año completo, pero depende del contexto. – Matthew

+0

Éste devolverá solo la diferencia entre los números del año. Es engañoso. – Aistis

81
$d1 = new DateTime('2011-03-12'); 
$d2 = new DateTime('2008-03-09'); 

$diff = $d2->diff($d1); 

echo $diff->y; 
+2

+1 para usar DateTime. – Jacob

+2

Sí, este debería ser el recomendado. – Aistis

0

la El valor de $ start_date y $ end_date es la cantidad de días, no segundos. por lo tanto, no debe dividir el $ diff con 365.25 * 60 * 60 * 24.

function daysDifference($endDate, $beginDate) 
{ 

    $date_parts1 = explode("-", $beginDate); 
    $date_parts2 = explode("-", $endDate); 
    $start_date = gregoriantojd($date_parts1[1], $date_parts1[2], $date_parts1[0]); 
    $end_date = gregoriantojd($date_parts2[1], $date_parts2[2], $date_parts2[0]); 
    $diff = abs($end_date - $start_date); 
    $years = floor($diff/365.25); 
    return $years; 
} 

echo daysDifference('2011-03-12','2008-03-09'); 
1

chicos aquí hay un buen código Solía ​​usar ..... no es mi idea .... yo acabamos de que en algún lugar de la red ...

También tienen una variedad de opciones espero que esta ayuda .........

function datediff($interval, $datefrom, $dateto, $using_timestamps = false) { 
    /* 
    $interval can be: 
    yyyy - Number of full years 
    q - Number of full quarters 
    m - Number of full months 
    y - Difference between day numbers 
     (eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".) 
    d - Number of full days 
    w - Number of full weekdays 
    ww - Number of full weeks 
    h - Number of full hours 
    n - Number of full minutes 
    s - Number of full seconds (default) 
    */ 

    if (!$using_timestamps) { 
     $datefrom = strtotime($datefrom, 0); 
     $dateto = strtotime($dateto, 0); 
    } 
    $difference = $dateto - $datefrom; // Difference in seconds 

    switch($interval) { 

    case 'yyyy': // Number of full years 

     $years_difference = floor($difference/31536000); 
     if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) { 
      $years_difference--; 
     } 
     if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) { 
      $years_difference++; 
     } 
     $datediff = $years_difference; 
     break; 

    case "q": // Number of full quarters 

     $quarters_difference = floor($difference/8035200); 
     while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) { 
      $months_difference++; 
     } 
     $quarters_difference--; 
     $datediff = $quarters_difference; 
     break; 

    case "m": // Number of full months 

     $months_difference = floor($difference/2678400); 
     while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) { 
      $months_difference++; 
     } 
     $months_difference--; 
     $datediff = $months_difference; 
     break; 

    case 'y': // Difference between day numbers 

     $datediff = date("z", $dateto) - date("z", $datefrom); 
     break; 

    case "d": // Number of full days 

     $datediff = floor($difference/86400); 
     break; 

    case "w": // Number of full weekdays 

     $days_difference = floor($difference/86400); 
     $weeks_difference = floor($days_difference/7); // Complete weeks 
     $first_day = date("w", $datefrom); 
     $days_remainder = floor($days_difference % 7); 
     $odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder? 
     if ($odd_days > 7) { // Sunday 
      $days_remainder--; 
     } 
     if ($odd_days > 6) { // Saturday 
      $days_remainder--; 
     } 
     $datediff = ($weeks_difference * 5) + $days_remainder; 
     break; 

    case "ww": // Number of full weeks 

     $datediff = floor($difference/604800); 
     break; 

    case "h": // Number of full hours 

     $datediff = floor($difference/3600); 
     break; 

    case "n": // Number of full minutes 

     $datediff = floor($difference/60); 
     break; 

    default: // Number of full seconds (default) 

     $datediff = $difference; 
     break; 
    }  

    return $datediff; 

} 

echo datediff('yyyy','2009-01-16','2011-03-16'); 
3

En una caja de PHP 5.2 (sí realmente, todavía existen) así que sin DateTime :: diff() de soporte que terminé usando esto:

$dateString='10-05-1975'; 
$years = round((time()-strtotime($dateString))/(3600*24*365.25)) 
-1
<?php 

$date1=date_create("1992-02-22");  

$date2=date_create("2016-09-24");  

$diff=date_diff($date1,$date2);  

echo $diff->y;  

?> 

Creo que esta es la mejor respuesta que he usado.

Gracias

Cuestiones relacionadas