2012-02-03 24 views
8

¿Alguien tiene un algoritmo en C# para calcular con precisión una edad con un DateTime en el formato Years.Months?Calcula una edad a partir de un formato de fecha y hora en años. ¿Qué significa?

por ejemplo.

  • DOB: 6-Sep-1988
  • Respuesta: 23,4

  • DOB: 31-Mar-1991

  • Respuesta: 20,10

  • DOB: 25-Feb -1991

  • Respuesta: 20.11

gracias

+0

hicieron marcó TimeSpan estructura ??? –

+1

@ Ravi: ¿Pensaste si eso puede determinar con precisión el número de meses y años entre dos fechas? –

+0

no, se pensó en sugerir NodaTime, pero cuando "daemon" está activo en SO, entonces ¿por qué preocuparse, se le ocurrirá por ejemplo :) –

Respuesta

11

Puede hacer esto en Noda Time con bastante facilidad:

using System; 
using NodaTime; 

class Test 
{ 
    static void Main() 
    { 
     ShowAge(1988, 9, 6); 
     ShowAge(1991, 3, 31); 
     ShowAge(1991, 2, 25); 
    } 

    private static readonly PeriodType YearMonth = 
     PeriodType.YearMonthDay.WithDaysRemoved(); 

    static void ShowAge(int year, int month, int day) 
    { 
     var birthday = new LocalDate(year, month, day); 
     // For consistency for future readers :) 
     var today = new LocalDate(2012, 2, 3); 

     Period period = Period.Between(birthday, today, YearMonth); 
     Console.WriteLine("Birthday: {0}; Age: {1} years, {2} months", 
          birthday, period.Years, period.Months); 
    } 
} 

hacerlo con solo DateTime apoyo de .NET sería posible, pero que tendría que hacer lo mismo aritmética, básicamente. Y es casi seguro que no sería tan claro. No es que yo soy parcial o nada :)

+0

* Usted *, un * sesgo *, sobre * DateTime *? Noooo ...;) –

+0

por cierto; ¿Tu enlace de tiempo noda es correcto? Obtuve un 404. –

+1

@AndrewBarber: Debes admitir que es un código bastante dulce :) –

-1
var date=new DateTime(DateTime.Now.Subtract(new DateTime(1988,10,31)).Ticks); 
Console.WriteLine((date.Year-1).ToString()+"."+(date.Month-1).ToString()); 
+1

No estoy seguro de lo que quiere decir – linkerro

+0

Esto se romperá por completo en una serie de situaciones. Por ejemplo, tome un cumpleaños del 1 de febrero de 2012, con un "hoy" o el 1 de marzo de 2012 ... eso es hace 29 días, lo que daría 0 meses usando este código. –

+0

@AndrewBarber: Realmente no es así. Esta roto. –

2

Este método no requiere ninguna biblioteca externa:

private static string AgeInYearsMonths(DateTime? DateOfBirth) 
{ 
    if (DateOfBirth == null) return ""; 
    if (DateOfBirth >= DateTime.Today) 
     throw new ArgumentException("DateOfBirth cannot be in future!"); 

    DateTime d = DateOfBirth.Value; 
    int monthCount = 0; 
    while ((d = d.AddMonths(1)) <= DateTime.Today) 
    { 
     monthCount++; 
    } 
    return string.Format("{0}.{1}", monthCount/12, monthCount % 12); 
} 
Cuestiones relacionadas