2011-02-04 9 views
7

Pracuję na niektórych programów medycznych i jestem zobowiązany do wyjścia wszystkich grup wiekowych w bardzo specyficzny sposób, w oparciu o następujące zasady:C# Formatowanie wieku - chodzi o dni, tygodnie, miesiące - Lata

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) 

Używanie C# Próbuję znaleźć prostą metodę zrobienia tego po prostu używając daty urodzenia osoby, każda pomoc byłaby bardzo doceniana.

Odpowiedz

7

pracowałem na coś podobnego wczoraj, ale coś takiego powinno własnych potrzeb: (zakładając 7 dzień tygodnia, dzień 31 miesięcy, 365 dziennie lat itd)

Zmieniona metoda: (ustalona zgodnie z sugestiami Boba)

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"); 
    } 

poprzedniej metody:

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'); 
     } 

Mam nadzieję, że to pomoże!

+0

Dla lat użytkowania obliczeń. Rok zamiast dni. .. powinien dokonać obliczeń prawidłowego rozliczania lat przestępnych. –

+0

+1 Byłoby elegancko zastosować swoje rozwiązanie jako metodę rozszerzenia. –

+0

@Andrew Good Point :), @Felice - w mojej oryginalnej implementacji była to metoda rozszerzająca, po prostu zmodyfikowana dla potrzeb PO. –

0

można uzyskać obiekt reprezentujący obecny wiek użytkownika za pomocą prostego odejmowania:

TimeSpan age = DateTime.Now - dateOfBirth; 

A potem to tylko kwestia robić pęczek jeśli klauzule

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

Powinieneś być w stanie aby dowiedzieć się, jak wykonać formatowanie.

3

Typ DateTime można odjąć od innych DateTimes, czego wynikiem jest TimeSpan reprezentujący lukę. Spróbuj tego:

var timeAlive = DateTime.Today - dateOfBirth.Date; 

Następnie spojrzeć na dni, miesiące i lata (dzielenie przez 7 dni do tygodni) od timeAlive i format odpowiednio.

2

Poniższe nie zawiera żadnych założeń dotyczących dni/miesięcy lub roku.
Z drugiej strony nie jest kompatybilny z 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 Jest to jedyny kod, który dokładnie spełnia specyfikacje.Z ciekawości, dlaczego nie jest kompatybilny z Y3K? – Justin

+0

To by było. Często używam 2 cyfry lat i często piszę rzeczy, które nie przetrwają stulecia. To nie dotyczy tutaj. – bob

+0

+1 Dobra funkcja Bob! (bardzo zwięzłe) - nie sądzę jednak, że bierze pod uwagę to, czy urodziny tej osoby minęły już w tym roku. Wpisuję własne urodziny, aby odkryć, że byłem o rok starszy ode mnie. –

Powiązane problemy