Как получить разницу между двумя датами в годах, месяцах и днях с использованием момента. js? Например, разница между 4/5/2014 и 2/22/2013 должна быть рассчитана как 1 год, 1 месяц и 14 дней.
Как получить разницу между 2 датами в годах, месяцах и днях с помощью момента. Js
Ответ 1
Moment.js не может обрабатывать этот сценарий напрямую. Это позволяет вам принимать разницу между двумя моментами, но результатом является истекшая продолжительность времени в миллисекундах. У Moment есть объект Duration, но он определяет месяц как фиксированную единицу в 30 дней - что, как мы знаем, не всегда так.
К счастью, есть плагин, который уже создан для момента, называемого "Precise Range" , который делает правильные вещи. Глядя на источник, он делает что-то похожее на torazaburo answer - но это правильно учитывает количество дней в месяце для настройки.
После включения обоих моментов и этого плагина (readable-range.js) в ваш проект вы можете просто называть его следующим образом:
var m1 = moment('2/22/2013','M/D/YYYY');
var m2 = moment('4/5/2014','M/D/YYYY');
var diff = moment.preciseDiff(m1, m2);
console.log(diff);
Выход "1 год 1 месяц 14 дней"
Ответ 2
Вам вряд ли нужен момент.
d1 = new Date(2014, 3, 5); // April 5, 2014
d2 = new Date(2013, 1, 22); // February 22, 2013
diff = new Date(
d1.getFullYear()-d2.getFullYear(),
d1.getMonth()-d2.getMonth(),
d1.getDate()-d2.getDate()
);
Это использует тот факт, что конструктор Date
является умным относительно отрицательных значений. Например, если количество месяцев отрицательное, это учитывает это и возвращается назад.
console.log(diff.getYear(), "Year(s),",
diff.getMonth(), "Month(s), and",
diff.getDate(), "Days.");
>> 1 Year(s), 1 Month(s), and 11 Days.
Ваш расчет неверен - это не 14 дней, это шесть оставшихся дней в феврале и первые пять дней апреля, так что это 11 дней, как компьютер правильно вычисляет.
Вторая попытка
Это может работать лучше, учитывая комментарий @MattJohnson:
dy = d1.getYear() - d2.getYear();
dm = d1.getMonth() - d2.getMonth();
dd = d1.getDate() - d2.getDate();
if (dd < 0) { dm -= 1; dd += 30; }
if (dm < 0) { dy -= 1; dm += 12; }
console.log(dy, "Year(s),", dm, "Month(s), and", dd, "Days.");