сделать одну дату больше другой c# - PullRequest
0 голосов
/ 27 февраля 2020

Привет, поэтому у меня есть это условие:

if (DateTime.Now.Subtract(dateTimePicker_Doc_BirthDate.Value).Days/(365)<18)
{
    this.errorProvider1.SetError(this.dateTimePicker_Doc_BirthDate, "Atleast 18 years old");
    valid = false;
}

И я хочу сделать еще одно, содержащее градацию этого человека и установить ограничение, которое на момент его окончания должно быть по крайней мере 18 лет старше.

Я пробовал это: но не работает

if (DateTime.Now.Subtract(dateTimePicker_Doc_Graduation.Value).Days / (365) < 18 + (18))
{
    this.errorProvider1.SetError(this.dateTimePicker_Doc_Graduation, "Atleast 18");
    valid = false;
}

1 Ответ

1 голос
/ 27 февраля 2020

Основная проблема здесь високосный год . Когда человеку, родившемуся в 29 Feb 2004, будет 18 год? Есть два возможных ответов:

https://www.buzzfeed.com/lanesainty/leap-year-birthday-teenager-court-ruling

  1. 28 Feb 2022 (Новая Зеландия для получения водительских прав; см. Комментарий xdtTransform)
  2. 1 Mar 2022 (Австралия)

В простом случае мы можем просто добавить 18 год к birthDate и посмотреть, наступает ли 18-й день рождения до или после today. Для 29 February нам также может понадобиться добавить 1 day:

 DateTime birthDate = dateTimePicker_Doc_BirthDate.Value.Date;
 DateTime today = DateTime.Today;
 // 0 for 28 Feb 2022; 1 for 1 Mar 2022 
 int leapPolicy = 1;

 if (birthDate.AddYears(18) <= today || // 18th birthday before today or today
     birthDate.Day == 29 &&   
     birthDate.Day == 2 && 
     birthDate.AddYears(18).AddDays(leapPolicy) == today) {

   // At least 18 years old
 } 

Обратите внимание, что этот год не 365, а 365.2425 дней (* 1034) * Григорианский календарь ), поэтому его нельзя поставить как ...Days / 365...

...