HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptMinor

Age in days, months and years

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
agemonthsyearsanddays

Problem

var AgeConvertor = {

    Age: function (formattedDate) {
      var now = new Date();
      var yearNow = now.getFullYear();
      var monthNow = now.getMonth() + 1;
      var dayNow = now.getDate();

      // Calculating in days
      var ONE_DAY = 1000 * 60 * 60 * 24;
      var ONE_MONTH = 1000 * 60 * 60 * 24 * 30;
      var date1_ms = new Date().getTime()
      var date2_ms = formattedDate.getTime()
      var difference_ms = Math.abs(date1_ms - date2_ms)
      var yearAge =  Math.round(difference_ms/ONE_DAY);

      if(yearAge  30 && yearAge < 365){
            return yearAge =  Math.round(difference_ms/ONE_MONTH) + 'M';
      } else {

      // Calculating in years
      var today = new Date(yearNow,monthNow,dayNow);

      if (yearNow < 100) {
        yearNow=yearNow+1900;
      }

      yearAge = yearNow - formattedDate.getFullYear();

      if (monthNow <= formattedDate.getMonth()) {
        if (monthNow < formattedDate.getMonth()) {
          yearAge--;    
        } else {
          if (dayNow < formattedDate.getDay()) {
            yearAge--;
          }
        }
      }
      return yearAge + 'Y';
     }
   }

}


  • How well can this code be improved?



  • Is there any fault in this code?



  • Does this code give desired results?



This code returns your age in days, months and years.

Solution


  • You should check if formattedDate is actually a Date object before using it (and change the variable name, since it sounds like it contains a formatted string).



  • It's strange, if not wrong, to consider months to be exactly 30 days.



  • You unnecessarily calculate Math.round(difference_ms/ONE_DAY) twice.



  • yearAge is a bad name for the variable at the beginning, since it doesn't contain anything concerning the year. And you reuse the variable later (then the name fits).



  • var today = new Date(yearNow,monthNow,dayNow); is wrong (and unnecessary), considering you just got monthNow from the current date and added 1. Fortunately you don't actually use it.



  • Testing for the full year to be below 100 is unnecessary. Only getYear returns such values.



  • It probably would be better just to compare the day, month and year of the birthday and the current day, and do those calculation of the age in days and months only if needed.

Context

StackExchange Code Review Q#3142, answer score: 4

Revisions (0)

No revisions yet.