Посчитать разницу между двух 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);
В сравнении дней выбрать между > и >= в зависимости от требований.