Возраст в днях, месяцах и годах


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. Как же может этот код быть улучшено?
  2. Есть ли ошибка в этом коде?
  3. Этот код даст желаемых результатов?

Этот код возвращает ваш возраст в днях, месяцах и годах.



5211
5
задан 27 июня 2011 в 09:06 Источник Поделиться
Комментарии
1 ответ


  • Вы должны проверить, если formattedDate на самом деле дата объекта перед его использованием (и изменить имя переменной, поскольку это звучит, как он содержит форматированную строку).

  • Это странно, если не ошибаюсь, считать месяцы будет ровно 30 дней.

  • Вы излишне рассчитают по математике.круглый(difference_ms/ONE_DAY) дважды.

  • yearAge - это плохое имя для переменной в самом начале, поскольку она не содержит ничего, касающегося год. И повторного использования переменной (тогда название подходит).

  • Варе сегодня = новая дата(yearNow,monthNow,dayNow); неправильно (и ненужные), учитывая, что вы только что monthNow от текущей даты и добавляется 1. К счастью, вы на самом деле не использовать его.

  • Тестирование за весь год будет ниже 100 - это лишнее. Только возвратите возвращает такие значения.

  • Он, вероятно, будет лучше просто сравнить, день, месяц и год рождения и нынешний день, и делай те расчет возраста в дни и месяцы, только если это необходимо.

4
ответ дан 27 июня 2011 в 11:06 Источник Поделиться