C#: Calculate Age in Years, Month and Days

Today I was given the task of finding the age of a person, provided the birth date. When I was given the task, I just said, just use the DateDiff function. But it is not that simple.

One thing I wanted was to keep the code simple and in a few lines of code. Here goes my first iteration.

         static void CalculateAge()
        {
            DateTime dateOfBirth;
            DateTime.TryParse("02/18/2008", out dateOfBirth);
            DateTime currentDate = DateTime.Now;

            TimeSpan difference = currentDate.Subtract(dateOfBirth);

            // This is to convert the timespan to datetime object
            DateTime age = DateTime.MinValue + difference;

            // Min value is 01/01/0001
            // Actual age is say 24 yrs, 9 months and 3 days represented as timespan
            // Min Valye + actual age = 25 yrs , 10 months and 4 days.
            // subtract our addition or 1 on all components to get the actual date.

            int ageInYears = age.Year - 1;
            int ageInMonths = age.Month - 1;
            int ageInDays = age.Day - 1;

            Console.WriteLine("{0}, {1}, {2}", ageInYears, ageInMonths, ageInDays);
        }

But then, there were problems with this method. If the current date is ’06/18/2009′ and the birth date was ’04/18/2000′, it returns, 9 yrs, 2 months and 2 days. The 2 days part is wrong. I didn’t have any clue as to why it appears.

Then I went down to the basics, using elementary mathematics of subtraction. Here goes the second iteration of the code.

        static void CalculateAge2()
        {
            DateTime dateOfBirth = new DateTime(2000, 6, 18);

            int ageInYears = 0;
            int ageInMonths = 0;
            int ageInDays = 0;

            CalculateAge(dateOfBirth, out ageInYears, out ageInMonths, out ageInDays);

            Console.WriteLine("{0}, {1}, {2}", ageInYears, ageInMonths, ageInDays);
        }

        ///
        /// Calculate the Age of a person given the birthdate.
        ///
        static void CalculateAge(DateTime adtDateOfBirth, out int aintNoOfYears, out int aintNoOfMonths, out int aintNoOfDays)
        {
            // get current date.
            DateTime adtCurrentDate = DateTime.Now;

            // find the literal difference
            aintNoOfDays = adtCurrentDate.Day - adtDateOfBirth.Day;
            aintNoOfMonths = adtCurrentDate.Month - adtDateOfBirth.Month;
            aintNoOfYears = adtCurrentDate.Year - adtDateOfBirth.Year;

            if (aintNoOfDays < 0)
            {
                aintNoOfDays += DateTime.DaysInMonth(adtCurrentDate.Year, adtCurrentDate.Month);
                aintNoOfMonths--;
            }

            if (aintNoOfMonths < 0)
            {
                aintNoOfMonths += 12;
                aintNoOfYears--;
            }
        }

And it works like a charm for all scenarios I throw upon it.

Scenario 1:
Current Date : 15 – 09 – 2009
Birth Date : 09 – 03 – 2000

Just a difference gives the result
Age : 6 – 6 – 9 Result is 9 yrs, 6 months, 6 days.

Scenario 2:
Current Date : 15 – 09 – 2009
Birth Date : 28 – 07 – 2000

Here since 15 – 28 < 0: we borrow one from the month and then add the no of days in the month to the current date. 15 + 30 = 45: 45 – 28 = 17 days
Then since one month is borrowed: 08 – 07 = 01 months
Remaining is normal difference
Age : 17 – 1 – 9 Result is 9 yrs, 1 months, 17 days.

Scenario 3:
Current Date : 15 – 09 – 2009
Birth Date : 28 – 12 – 2000
Here since 15 – 28 < 0: we borrow one from the month and then add the no of days in the current month to the current date. 15 + 30 = 45: 45 – 28 = 17 days
Then since one month is borrowed: 08 – 12: So we are supposed to borrow a year and add no of months in current year to current month. 08 + 12 = 20: 20 – 12 = 8 months
Since a year was borrowed: 2008 – 2000: 8 yrs
Remaining is normal difference
Age : 17 – 8 – 8 Result is 8 yrs, 8 months, 17 days.

But I know there must be better ways to do it. Feel free to drop in code snippets. Comments too are most welcome.

Comments

14 responses to “C#: Calculate Age in Years, Month and Days”

  1. Manikandan Avatar
    Manikandan

    You got extra 2 days since you did not take leap years into account.
    Nice job! Keep rocking 🙂

  2. Ani Avatar
    Ani

    This was the most helpful post I surfed for, most neat and clear. Thanks.

  3. pavan Avatar
    pavan

    Good job. Thank you

  4. Awais Avatar
    Awais

    thanx for the help………

  5. Sojan Avatar
    Sojan

    The condition of the two if loops of CalculateAge method displays <
    What should be the check there?

  6. Sojan Avatar
    Sojan

    Ignore my previous reply. The second logic is awesome. Thank you.

  7. Sojan Avatar
    Sojan

    A scenario that would fail here is:
    Current Date : 11 – 04 – 2011
    Birth Date : 28 – 03 – 2011

    The logic is calculating the age as 13 days instead of 14. How can we correct this?
    I think the 29th line should be
    aintNoOfDays += DateTime.DaysInMonth(adtDateOfBirth.Year, adtDateOfBirth.Month);

  8. Rosy Avatar
    Rosy

    plz help me guyz .. the if statement in line 27 & 33 shows errors in C# .. I dont understand why ?? plz I have an exam 2morrow

  9. Andries Avatar
    Andries

    This is awesome, thank you 🙂

  10. anmol Avatar
    anmol

    i have a better logic…but a bit longer…but accurate..

    1. Rajeshwaran S P Avatar

      Please do post it in the reply, so someone looking for better solution can use it.

  11. shubham saxena Avatar

    Sir, I have some c# questions. Can you please help me in solving those?

    1. Rajeshwaran S P Avatar

      Yes Mr Saxena. Please let me know your question and we can try.

Leave a reply to Rajeshwaran S P Cancel reply