18 岁以上的 Ionic 验证和 Angular 问题

Age 18+ Validation with Ionic & Angular issue

所以,我设法让它工作,但 2004 年 returns 未满 18 岁。 假设我将年份设置为 01/13/2004,它 returns 年龄为 18 岁,但 returns 他们未满 18 岁。这也适用于一月中满足要求的任何一天因为是 18 岁。这是检查年龄和日期的功能。我目前最好的猜测可能是时区问题?

GetAge(date: string): number {
    let today = new Date();
    let birthDate = new Date(date);
    let age = today.getFullYear() - birthDate.getFullYear();
    let month = today.getMonth() - birthDate.getMonth();
    
    if (month < 0 || (month === 0 && today.getDate() < birthDate.getDate())) {
      age--;
    }
    console.log('Age: ' + age + '\nBirthday: ' + birthDate);
    return age;
  }

  AgeCheck(controlName: string): ValidatorFn {
    return (controls: AbstractControl) => {
      const control = controls.get(controlName);
      
      if (control?.errors && !control.errors['under18']) {
        return null;
      } 
  
      if (this.GetAge(control?.value) <= 18) {
        return { under18: true }
      } else {
        return null;   
      }
    }
  }

我将其用作日期选择输入

<ion-input type="date" formControlName="dateofbirth"></ion-input>

这是 FormBuilder 的示例

this.credentials = this.fb.group({
      dateofbirth: ['', [Validators.required]],
    }, {validator: [this.AgeCheck('dateofbirth')]});

控制台输出截图

最好的方法是使用 Moment.js,例如:

npm install moment --save  

import * as moment from 'moment';

...

age18Check(birthday: Date) {
  return moment(birthday).add(18, 'years') <= moment();
}

通过这种方式,如果将小时插入生日(日期),您还可以检查小时。但是如果你对时间有问题,你也可以这样做:

age18Check(birthday: Date) {
  return
    moment(birthday).add(18, 'years').format('DD/MM/YYYY') <= 
    moment().format('DD/MM/YYYY');
}

我希望你正在寻找这个!