Как получить разницу между 2 датами в годах, месяцах и днях с помощью момента. Js

Как получить разницу между двумя датами в годах, месяцах и днях с использованием момента. js? Например, разница между 4/5/2014 и 2/22/2013 должна быть рассчитана как 1 год, 1 месяц и 14 дней.

Ответ 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.");