Calcular edad a partir de una fecha

Calcular edad a partir de una fecha

¿Cómo puedo calcular la edad a partir de una fecha?
Este es mi código, al ejecutarlo me sale undefined en el campo que quiero que aparezca la edad.
import { Component, OnInit, Input } from '@angular/core'; import { DatosDTO } from '../../dto/datos' @Component({ selector: 'app-datos-personales', templateUrl: './datos-personales.component.html', styleUrls: ['./datos-personales.component.css'] }) export class DatosPersonalesComponent implements OnInit { @Input() datosDTO: DatosDTO; public age: number; constructor() {} ngOnInit() { this.datosDTO = new DatosDTO(); } CalculateAge(): void { if (this.datosDTO.datosPersonales.fechaNacimiento) { var timeDiff = Math.abs(Date.now() - this.datosDTO.datosPersonales.fechaNacimiento); this.age = Math.ceil((timeDiff / (1000 * 3600 * 24)) / 365); } } } export class DatosPersona { tipoIdentificacion: string = ""; numeroIdentificacion: string = ""; nombres: string = ""; apellidos: string = ""; fechaNacimiento: number; }

Solutions/Answers:

Answer 1:

  1. Asegúrate que la función devuelva un dato de tipo number en vez de void.
  2. En lugar de var utiliza let o const.

Le agregué un else para que devuelva un 0, con esto me aseguro de que me función siempre me regrese un número.

CalculateAge(): number {
    if (this.datosDTO.datosPersonales.fechaNacimiento) {
        let timeDiff = Math.abs(Date.now() - <any>this.datosDTO.datosPersonales.fechaNacimiento);
        return Math.ceil((timeDiff / (1000 * 3600 * 24)) / 365);
    } else {
        return 0;
    }
}

Esta otra es mi propuesta el cual trabajo con objetos de tipo Date y utilizo operaciones que puedo realizar con fechas. Ademas utilizo un función getter que se encarga de devolver un dato de tipo numérico.

get CalculateAge(): number {
    const today: Date = new Date();
    const birthDate: Date = new Date(this.datosDTO.datosPersonales.fechaNacimiento);
    let age: number = today.getFullYear() - birthDate.getFullYear();
    const month: number = today.getMonth() - birthDate.getMonth();
    if (month < 0 || (month === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }
    return age;
}

Answer 2:

Me parece que el problema es que tu función CalculateAge() no devuelve el valor de la edad para bindearse al input

Una posible corrección sería

CalculateAge(): number {
    if (this.datosDTO.datosPersonales.fechaNacimiento) {
        var timeDiff = Math.abs(Date.now() - this.datosDTO.datosPersonales.fechaNacimiento);
        return Math.ceil((timeDiff / (1000 * 3600 * 24)) / 365);
    } else {
        return null;
    }
}

Answer 3:

Puedes aprovechar tu clase DatosPersona y crear ahí una variable calculada (una función qué es usada como una variable) que haga ése cálculo.

export class DatosPersona {

  tipoIdentificacion: string = "";
  numeroIdentificacion: string = "";
  nombres: string = "";
  apellidos: string = "";
  fechaNacimiento: number;
  get edad(): number {
    return ~~((Date.now() - this.fechaNacimiento || Date.now()) / (24 * 3600 * 365.25 * 1000));
  }

}

Luego la puedes utilizar así:

this.datosDTO.datosPersonales.edad

References

Loading...