2010-08-01 8 views
6

Tengo fechas de nacimiento en mi sitio en el formato 12.01.1980.PHP calcular la edad actual de la persona

$person_date (string) = Day.Month.Year 

Quieres añadir una antigüedad de la persona. Me gusta "Actualmente 30 años" (2010 - 1980 = 30 años).

Pero Makin la función sólo en años no pueden dar un resultado perfecto:

Si la persona es la fecha de nacimiento y la fecha actual 12.12.1980 es 01.01.2010 la persona no tiene 30 años de edad. Son 29 años y un mes.

Debe haber un cálculo en la orientación tanto año, mes y día de nacimiento con comparación de fecha actual:

0) Analizar las fechas.

Birth date (Day.Month.Year): 
Day = $birth_day; 
Month = $birth_month; 
Year = $birth_year; 

Current date (Day.Month.Year): 
Day = $current_day; 
Month = $current_month; 
Year = $current_year; 

1) la comparación año, 2010-1980 = escritura "30" (que sea $total_year variables)

2) comparar los meses, si (fecha de nacimiento mes es más grande> que el mes actual (como 12 en el nacimiento y 01 actual)) {hacer menos un año desde $total_year variable (30 - 1 = 29)}. Si ocurre lo contrario, termine los cálculos en este punto. De lo contrario, vaya al siguiente (3 pasos).

3) else if (birth month < current month) { $total_year = $total_year (30); }

4) else if (birth month = current month) { $total_year = $total_year (30); }

y comprobar el día (en este paso):

if(birth day = current day) { $total_year = $total_year; } 
else if (birth day > current day) { $total_year = $total_year -1; } 
else if (birth day < current day) { $total_year = $total_year; } 

5) echo $ total_year;

Mi conocimiento de php no es bueno, espero que pueda ayudar.

Gracias.

+0

Cuente los días entre la fecha de nacimiento y ahora, multiplique por 4, divida por 1461 (en lugar de dividir por coma flotante por 365.25)? – pascal

+0

¿dará una respuesta correcta? – James

+0

@pascal: ¿cómo contarías los días? – Svish

Respuesta

36

Puede usar el y su método diff().

<?php 
$bday = new DateTime('12.12.1980'); 
// $today = new DateTime('00:00:00'); - use this for the current date 
$today = new DateTime('2010-08-01 00:00:00'); // for testing purposes 

$diff = $today->diff($bday); 

printf('%d years, %d month, %d days', $diff->y, $diff->m, $diff->d); 

impresiones 29 years, 7 month, 20 days

+1

Eso es lo que necesito, gracias hombre! – James

+0

Esto es realmente útil, gracias! – itsricky

6

Una extensión de la respuesta de @ VolkerK - que es excelente! Nunca me gusta ver la edad de cero, que sucede si solo usas el año. Esta función muestra su edad en meses (si tienen un mes de edad o más) y de lo contrario en días.

function calculate_age($birthday) 
{ 
    $today = new DateTime(); 
    $diff = $today->diff(new DateTime($birthday)); 

    if ($diff->y) 
    { 
     return $diff->y . ' years'; 
    } 
    elseif ($diff->m) 
    { 
     return $diff->m . ' months'; 
    } 
    else 
    { 
     return $diff->d . ' days'; 
    } 
} 
+1

Buen trabajo aquí @jonathan. Es una extensión de sentido común del trabajo de VolkerK. Lo modifiqué nuevamente para darle una lectura más 'humana', ver abajo. ¡Gracias! – itsricky

2

He ampliado la respuesta de @ Jonathan, para dar una respuesta más "humana".

El uso de estas fechas:

$birthday= new DateTime('2011-11-21'); 
//Your date of birth. 

Y llamar a esta función:

function calculate_age($birthday) 
{ 
    $today = new DateTime(); 
    $diff = $today->diff(new DateTime($birthday)); 

    if ($diff->y) 
    { 
     return 'Age: ' . $diff->y . ' years, ' . $diff->m . ' months'; 
    } 
    elseif ($diff->m) 
    { 
     return 'Age: ' . $diff->m . ' months, ' . $diff->d . ' days'; 
    } 
    else 
    { 
     return 'Age: ' . $diff->d . ' days old!'; 
    } 
}; 

está regresando:

Age: 1 years, 2 months 

linda - para los más jóvenes realmente sólo unos pocos días de edad!

+0

$ cumpleaños debe ser $ bday – ow3n

Cuestiones relacionadas