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!
Dla lat użytkowania obliczeń. Rok zamiast dni. .. powinien dokonać obliczeń prawidłowego rozliczania lat przestępnych. –
+1 Byłoby elegancko zastosować swoje rozwiązanie jako metodę rozszerzenia. –
@Andrew Good Point :), @Felice - w mojej oryginalnej implementacji była to metoda rozszerzająca, po prostu zmodyfikowana dla potrzeb PO. –