2010-06-30 37 views
32

Duplicar posible:
How do I calculate someone’s age in C#?Calcule la diferencia entre dos fechas y obtenga el valor en años?

quiero para calcular básicamente la edad de los empleados - Así tenemos fecha de nacimiento para cada empleado, tanto en C# Lado Quiero hacer algo como esto -

int age=Convert.Int32(DateTime.Now-DOB); 

Puedo usar días y manipular a continuación, obtener la edad ... pero quería saber si hay algo Puedo usarlo directamente para obtener el número de años.

Respuesta

60

¿Desea calcular la edad en años para un empleado? A continuación, puede utilizar este fragmento (de Calculate age in C#):

DateTime now = DateTime.Today; 
int age = now.Year - bday.Year; 
if (bday > now.AddYears(-age)) age--; 

Si no es así, por favor especifique. Estoy teniendo dificultades para entender lo que quieres.

+0

Ya que esto es lo que quiero hacer .. .sorry por no expresarlo bien ... – Vishal

+0

¡Genial! No hay problemas. – alexn

+0

Hola, ¿por qué reduces la edad en la tercera línea? – WTFZane

0

Math.Round (DateTime.Now.Subtract (DOB) .TotalDays/365,0)

Como se ha señalado, esto no funcionará. Tendría que hacer esto:

(Int32)Math.Round((span.TotalDays - (span.TotalDays % 365.0))/365.0); 

y en ese punto la otra solución es menos compleja y continúa siendo precisa en tramos más grandes.

Editar 2, ¿qué tal:

Math.Floor(DateTime.Now.Subtract(DOB).TotalDays/365.0) 

Cristo soy muy malo en matemáticas básicas en estos días ...

+1

No funciona - alexn lo tiene –

+0

Esto solo funcionará para tramos cortos, obviamente, pero si nadie va a tener más de 150 años ... – Kendrick

+0

Sí, no funciona.Timespan necesita una propiedad "TotalYears" :-) – Kendrick

5

En this sitio que tienen:

public static int CalculateAge(DateTime BirthDate) 
    { 
     int YearsPassed = DateTime.Now.Year - BirthDate.Year; 
     // Are we before the birth date this year? If so subtract one year from the mix 
     if (DateTime.Now.Month < BirthDate.Month || (DateTime.Now.Month == BirthDate.Month && DateTime.Now.Day < BirthDate.Day)) 
     { 
      YearsPassed--; 
     } 
     return YearsPassed; 
    } 
14

la sustracción de dos DateTime le da a TimeSpan atrás. Desafortunadamente, la unidad más grande que te devuelve es Días.

Aunque no es exacta, se puede estiman que, de esta manera:

int days = (DateTime.Today - DOB).Days; 

//assume 365.25 days per year 
decimal years = days/365.25m; 

Editar: ¡Vaya, TotalDays es un doble, Días es un int.

+0

¡Buena respuesta! Me pregunto acerca de la división con 365.25. ¿Por qué no solo 365.0? Encontré eso en otros temas también y me pregunto si puedes iluminarme. – ppolyzos

+4

0.25 se debe a los años bisiestos –

+0

también me fijo que utilizar días en lugar de TotalDays. TotalDays es un doble, no un int. Dado que no se preocupan por días parciales de todos modos ... – Powerlord

-3
(DateTime.Now - DOB).TotalDays/365 

Restando una estructura DateTime de otra estructura DateTime le dará una estructura TimeSpan que tiene las TotalDays propiedad ... luego simplemente dividir por 365

+1

No todos los años tiene 365 días ... – Rob

4
private static Int32 CalculateAge(DateTime DOB) 
    { 
     DateTime temp = DOB; 
     Int32 age = 0; 
     while ((temp = temp.AddYears(1)) < DateTime.Now) 
      age++; 
     return age; 
    } 
+0

dividiendo por 365 no maneja los años bisiestos y, de hecho dividiendo el resultado por 365,25 realidad no manejar con precisión los años bisiestos tampoco. –

Cuestiones relacionadas