Nodemon
Nodemon

Reputation: 1046

JavaScript to calculate Age based on date

Currently am using JavaScript code to calculate age based on date of birth given by user, its working good but the age showing is wrong.

mycode :

function getAge(dateString) {
  var now = new Date();
  var today = new Date(now.getYear(),now.getMonth(),now.getDate());

  var yearNow = now.getYear();
  var monthNow = now.getMonth();
  var dateNow = now.getDate();

  var dob = new Date(dateString.substring(6,10),
                     dateString.substring(0,2)-1,                   
                     dateString.substring(3,5)                  
                     );

  var yearDob = dob.getYear();
  var monthDob = dob.getMonth();
  var dateDob = dob.getDate();
  var age = {};
  var ageString = "";
  var yearString = "";
  var monthString = "";
  var dayString = "";


  yearAge = yearNow - yearDob;

  if (monthNow >= monthDob)
    var monthAge = monthNow - monthDob;
  else {
    yearAge--;
    var monthAge = 12 + monthNow -monthDob;
  }

  if (dateNow >= dateDob)
    var dateAge = dateNow - dateDob;
  else {
    monthAge--;
    var dateAge = 31 + dateNow - dateDob;

    if (monthAge < 0) {
      monthAge = 11;
      yearAge--;
    }
  }

  age = {
      years: yearAge,
      months: monthAge,
      days: dateAge
      };

  if ( age.years > 1 ) yearString = " years";
  else yearString = " year";
  if ( age.months> 1 ) monthString = " months";
  else monthString = " month";
  if ( age.days > 1 ) dayString = " days";
  else dayString = " day";


  if ( (age.years > 0) && (age.months > 0) && (age.days > 0) )
    ageString = age.years + yearString + ", " + age.months + monthString + ", and " + age.days + dayString + " old.";
  else if ( (age.years == 0) && (age.months == 0) && (age.days > 0) )
    ageString = "Only " + age.days + dayString + " old!";
  else if ( (age.years > 0) && (age.months == 0) && (age.days == 0) )
    ageString = age.years + yearString + " old. Happy Birthday!!";
  else if ( (age.years > 0) && (age.months > 0) && (age.days == 0) )
    ageString = age.years + yearString + " and " + age.months + monthString + " old.";
  else if ( (age.years == 0) && (age.months > 0) && (age.days > 0) )
    ageString = age.months + monthString + " and " + age.days + dayString + " old.";
  else if ( (age.years > 0) && (age.months == 0) && (age.days > 0) )
    ageString = age.years + yearString + " and " + age.days + dayString + " old.";
  else if ( (age.years == 0) && (age.months > 0) && (age.days == 0) )
    ageString = age.months + monthString + " old.";
  else ageString = "Oops! Could not calculate age!";

  return ageString;
}
$(".date").on("change", function(){
var dob = $('.date').val();
 var age = getAge(dob); 
 $('.age').val(age);
});

Here is link of jsfiddle Click Here

If i give a date 21/03/1993 am getting age as 20, but the correct age is 23

Upvotes: 4

Views: 8830

Answers (3)

phuzi
phuzi

Reputation: 13059

Whenever I have to anything with dates in Javascript I tend to lean towards using Moment JS. This makes what you're trying to do so much simpler.

function age(birthDateString){
    var now = moment();
    var birthDate = moment('21/03/1993','DD/MM/YYYY');
    var yearDiff = moment.duration(now - birthDateString).as('years');
    return Math.floor(yearDiff);
}

Done - age('21/03/1993') returns 22

Upvotes: 4

patricmj
patricmj

Reputation: 373

Your input format is wrong. Try 03.21.1993.

Upvotes: -1

Ajay Narain Mathur
Ajay Narain Mathur

Reputation: 5466

The date order is mm/dd/yyyy or yyyy/mm/dd

So, Change you code to :

 var dob = new Date(dateString.substring(6,10),
                     dateString.substring(3,5),                   
                     dateString.substring(0,2)-1                  
                     );

Important Suggestion:

In javascript date object, month starts from 0, so your calculation is wrong.

Change code to:

if (monthNow >= monthDob)
  var monthAge = monthNow - monthDob + 1;  //<== add one here
  else {
    yearAge--;
    var monthAge = 12 + monthNow -monthDob;
  }

See this Fiddle

Upvotes: 1

Related Questions