6
\$\begingroup\$
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) {
            return yearAge =  Math.round(difference_ms/ONE_DAY) + 'D';
      // This condition checks if the number of days is more than 30
      } else 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';
     }
   }

}
  1. How well can this code be improved?
  2. Is there any fault in this code?
  3. Does this code give desired results?

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

\$\endgroup\$
1
  • 1
    \$\begingroup\$ Why is it an object? it only has one method and you never use this \$\endgroup\$
    – Raynos
    Commented Jun 27, 2011 at 10:18

1 Answer 1

4
\$\begingroup\$
  • 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.
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.