Поиск блогу

воскресенье, 27 сентября 2015 г.

Сколько лет? Сколько зим?

    На форумах часто можно встретить статус бар с отображением времени, что-то вроде езжу на машине 5 лет два месяца и три дня. Появилась у меня задача сделать тоже самое, но без картинки. Решил использовать JavaScript.

     Суть скрипта ясна. Берем существующую дату и вычитаем из неё знаменательную. Сложность заключается в том, что просто так дату из даты не вычесть, так как результат будет в секундах и перевод обратно в дату не даст желаемого результата. По-этому будем вычитать отдельно: год из года, месяц из месяца, день из дня.
     Вычитание годов трудностей не вызывает, так как нынешняя дата всегда больше чем, дата события. А вот дальше идут трудности.
     Месяцы.  Когда месяц существующий больше месяца знаменательной даты, то проблем тоже нет. В противном случае получаем отрицательной значение, которое в положительное превращается  в результате математический преобразований:  
mm = 12-d1.getMonth()+nd.getMonth()-dk
где d1 знаменательная дата, а nd дата настоящая. dk - это единичка на которую убавляем количество месяцев, если не дожили до знаменательного дня. Аналогично на 1 уменьшаем количество лет в нашем случае с месяцами.
     Дни. С днями тоже самое, что и с месяцами, только если месяцев в году всегда 12, то дней в каждом месяце разное количество. А в феврале количество дней еще зависит и от года. Тут нужна функция определения количества дней в месяце:
function daysInMonth(month,year) {
   return new Date(year, month+1, 0).getDate();
}
Здесь не забываем, что месяцы считаются с нуля, то есть daysInMonth(1,2015) вернет 28.
    Вот вроде бы и все с подсчетами. Получили следующий код.
function daysInMonth(month,year) {
   return new Date(year, month+1, 0).getDate();
}
function countDate(y,m,c) {
  var d1 = new Date();
  d1.setYear(y);
  d1.setMonth(m-1);
  d1.setDate(c);
  var nd = new Date();
  var yy = nd.getFullYear()-d1.getFullYear();
  var mm = nd.getMonth()-d1.getMonth();
  var dd = nd.getDate()-d1.getDate();
  var dk=0;
      if  (dd < 0) { dd = daysInMonth(nd.getFullYear(),nd.getMonth())-d1.getDate()+nd.getDate();
       dk=1;
      }
   var mk=0;
   if (mm < 0) { mm = 12-d1.getMonth()+nd.getMonth()-dk
      mk=1;
   }
   yy=yy-mk;
   var mas=[yy,mm,dd];
    return mas
}
   В функции countDate месяцы уже считаются с единицы, так что главное тут не запутаться. Но на этом проблемы не заканчиваются. Надо же результат еще вывести, а там уже начинается война с падежами. А вот об этом в следующий  раз.

Комментариев нет:

Отправить комментарий