Посчитать разницу между двух DateTime

Пытаюсь посчитать точный возраст от дня рождения до сегодняшней даты.

Написал такой вот код. Хочу его оптимизировать, подскажете как?

public int Сalculate_age()
        {
            int day = DateTime.Now.Day - Birthday.Day;
            int year = DateTime.Now.Year - Birthday.Year;
            int month = DateTime.Now.Month - Birthday.Month;

            if (DateTime.Now.Year >= Birthday.Year) // год
            {

                if (DateTime.Now.Month < Birthday.Month)// месяц 
                {
                    year = year - 1;
                    month = (12 + DateTime.Now.Month) - Birthday.Month;
                }
                if (DateTime.Now.Day < Birthday.Day) // день
                {
                    month = month - 1;
                    if ((month == 4) || (month == 6) || (month == 9) || (month == 11))
                        day = (30 + DateTime.Now.Day) - Birthday.Day; // месяцы с 30 
                    else if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
                        day = ((31 + DateTime.Now.Day) - Birthday.Day);// месяцы с 31
                    else if (Birthday.Year % 4 == 0 || Birthday.Year % 400 == 0)
                        day = (29 + DateTime.Now.Day) - Birthday.Day;// месяц с 29 
                    else
                        day = (28 + DateTime.Now.Day) - Birthday.Day;// месяц с 28
                }

            }
            return (year);
        }

Так же я не понимаю, почему переменная day такого цвета? 1


Ответы (2 шт):

Автор решения: Bulson
private int CalculateAge(DateTime birthdate)
{
    DateTime today = DateTime.Today;
    int age = today.Year - birthdate.Year;
    if (birthdate > today.AddYears(-age))
        age--;
    return age;
}
→ Ссылка
Автор решения: Qwertiy

Во-первых, DateTime.Now умеет меняться и может оказаться, что ты один раз прочитал одну дату, а следующий - уже другую. Так что даже если реализация в остальном верная, этого достаточно, чтобы иногда код работал неправильно.

Во-вторых, всё считается гораздо проще:

var now = DateTime.Now;
return now.Year - birthday.Year - 1 + (now.Month > birdthday.Month || now.Month == birdthday.Month && now.Day >= birthday.Day ? 1 : 0);

Можно немного упростить:

var now = DateTime.Now;
return now.Year - birthday.Year - (now.Month > birdthday.Month || now.Month == birdthday.Month && now.Day >= birthday.Day ? 0 : 1);

В сравнении дней выбрать между > и >= в зависимости от требований.

→ Ссылка