На форумах часто можно встретить статус бар с отображением времени, что-то вроде езжу на машине 5 лет два месяца и три дня. Появилась у меня задача сделать тоже самое, но без картинки. Решил использовать JavaScript.
Суть скрипта ясна. Берем существующую дату и вычитаем из неё знаменательную. Сложность заключается в том, что просто так дату из даты не вычесть, так как результат будет в секундах и перевод обратно в дату не даст желаемого результата. По-этому будем вычитать отдельно: год из года, месяц из месяца, день из дня.
Вычитание годов трудностей не вызывает, так как нынешняя дата всегда больше чем, дата события. А вот дальше идут трудности.
Месяцы. Когда месяц существующий больше месяца знаменательной даты, то проблем тоже нет. В противном случае получаем отрицательной значение, которое в положительное превращается в результате математический преобразований:
mm = 12-d1.getMonth()+nd.getMonth()-dk
где d1 знаменательная дата, а nd дата настоящая. dk - это единичка на которую убавляем количество месяцев, если не дожили до знаменательного дня. Аналогично на 1 уменьшаем количество лет в нашем случае с месяцами.
Дни. С днями тоже самое, что и с месяцами, только если месяцев в году всегда 12, то дней в каждом месяце разное количество. А в феврале количество дней еще зависит и от года. Тут нужна функция определения количества дней в месяце:
function daysInMonth(month,year) {Здесь не забываем, что месяцы считаются с нуля, то есть daysInMonth(1,2015) вернет 28.
return new Date(year, month+1, 0).getDate();
}
Вот вроде бы и все с подсчетами. Получили следующий код.
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 месяцы уже считаются с единицы, так что главное тут не запутаться. Но на этом проблемы не заканчиваются. Надо же результат еще вывести, а там уже начинается война с падежами. А вот об этом в следующий раз.

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