2011-02-04 27 views
7

estoy trabajando en algún software médico y tengo la obligación de salida de todas las edades de una manera muy específica, en base a las siguientes reglas:C# de formato Edad - En cuanto a días, semanas, meses - Años

If under 6 Weeks old : ###D (Number of Days) 
If under 6 Months old : ###W (Number of Weeks) 
If under 2 Years old : ###M (Number of Months) 
If above 2 Years old : ###Y (Number of Years) 

Uso C# Estoy tratando de encontrar un método simple para hacer esto simplemente usando la fecha de nacimiento de una persona, cualquier ayuda sería muy apreciada.

Respuesta

7

yo estaba trabajando en algo similar ayer, pero algo como esto debe ajustarse a sus necesidades: (suponiendo 7 semanas del día, los 31 meses del día, los 365 años del día etc.)

revisado Método:(Corregido según sugerencias de Bob)

public static string ConvertAge(DateTime dob) 
    { 
     DateTime today = DateTime.Today; 
     string fmt = "{0:0##}{1}"; 

     //Greater than 2 Years old - Ouput Years 
     if (dob <= today.AddYears(-2)) 
      return string.Format(fmt, (dob.DayOfYear <= today.DayOfYear) ? 
      (today.Year - dob.Year) : (today.Year - dob.Year)-1, "Y"); 
     //Less than 2 Years - Output Months 
     if (dob < today.AddMonths(-2)) 
      return string.Format(fmt, (dob.DayOfYear <= today.DayOfYear) ? 
      (today.Year - dob.Year) * 12 + (today.Month - dob.Month) : 
      ((today.Year - dob.Year) * 12 + (today.Month - dob.Month))-1 , "M"); 
     //Less than 2 Months - Output Weeks 
     if (dob < today.AddDays(-2 * 7)) 
      return string.Format(fmt, (today - dob).Days/7, "W"); 
     //Less than 2 Weeks - Output Days 
     return string.Format(fmt, (today - dob).Days, "D"); 
    } 

Método Anterior:

public string ConvertAge(DateTime dateOfBirth) 
     { 
      int daysOld = (DateTime.Now - dateOfBirth).Days; 

      //Age < 6 Weeks 
      if (daysOld < (6 * 7)) 
       return String.Format("{0:0##}{1}", daysOld, 'D'); 
      //Age < 6 Months 
      else if (daysOld < (6 * 31)) 
       return String.Format("{0:0##}{1}", daysOld/7, 'W'); 
      //Age < 2 Years 
      else if (daysOld < (2 * 365)) 
       return String.Format("{0:0##}{1}", daysOld/31, 'M'); 
      //Age >= 2 Years 
      else 
       return String.Format("{0:0##}{1}", daysOld/365, 'Y'); 
     } 

Espero que esto ayude!

+0

Para el uso de cálculo de años anteriores. Los años en lugar de .Days ..... deberían hacer los cálculos propios para los años bisiestos. –

+0

+1 Sería elegante implementar su solución como un método de extensión. –

+0

@Andrew Good Point :), @Felice: en mi implementación original era un método de extensión, simplemente lo modifiqué para las necesidades de OP. –

0

Usted puede obtener un objeto que representa la edad actual del usuario con un simple resta:

TimeSpan age = DateTime.Now - dateOfBirth; 

Y entonces es sólo una cuestión de hacer un montón de si las cláusulas

if (age.TotalDays < 6 * 7) // 6 weeks 
    // ... 
else if (age.TotalDays < 6 * 30) // 6 months 
    // ... 
// et cetera 

Usted debe ser capaz para averiguar cómo hacer tu formateo.

3

Un tipo de fecha y hora se puede sustraer de otros DateTimes, lo que da como resultado un TimeSpan que representa el espacio. Prueba esto:

var timeAlive = DateTime.Today - dateOfBirth.Date; 

Entonces, mira a los días, meses y años (Días dividir por 7 para semanas) de timeAlive, y el formato en consecuencia.

2

Lo siguiente no hace suposiciones sobre días/meses o año.
En el lado negativo, no es compatible con Y3K.

public static string GetAge (DateTime dob) { 
     DateTime today = DateTime.Now; 
     string fmt = "{0:0##}{1}"; 

     if (dob < today.AddYears(-2)) return string.Format(fmt, today.Year - dob.Year, "Y"); 
     if (dob < today.AddMonths(-6))return string.Format(fmt, (today.Year - dob.Year)*12 + (today.Month - dob.Month), "M"); 
     if (dob < today.AddDays(-6 * 7)) return string.Format(fmt, (today - dob).Days/7, "W"); 
     return string.Format(fmt, (today - dob).Days, "D"); 
    } 
+0

+1 Este es el único con código que cumple con precisión las especificaciones.Por curiosidad, ¿por qué no es compatible con Y3K? – Justin

+0

Sería. Con frecuencia uso años de 2 dígitos y a menudo escribo cosas que no sobrevivirán al siglo. Eso no aplica aquí. – bob

+0

+1 Bonita función Bob! (muy conciso) - sin embargo, no creo que tenga en cuenta si el cumpleaños de la persona ya pasó este año. Ingresé mi propio cumpleaños para descubrir que era un año mayor de lo que realmente soy. –

Cuestiones relacionadas