Подтвердить что ты не робот

Moment.js - Получите разницу в два дня рождения в годах, месяцах и днях

Я ищу способ использовать momentjs для разбора двух дат, чтобы показать разницу.

Я хочу иметь его в формате: "X лет, Y месяцев, Z дней".

В течение лет и месяцев в тот момент, когда библиотека и оператор modulo работают хорошо. Но на днях это еще одна сказка, поскольку я не хочу справляться с високосными годами и всем этим. Пока у меня в голове есть логика:

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var years = a.diff(b, 'years');
var months = a.diff(b, 'months') % 12;
var days = a.diff(b, 'days');
// Abit stuck here as leap years, and difference in number of days in months. 
// And a.diff(b, 'days') returns total number of days.
return years + '' + months + '' + days;
4b9b3361

Ответ 1

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

При этом вы можете легко получить разницу в днях и не использовать также оператор modulo.

Пример здесь

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var years = a.diff(b, 'year');
b.add(years, 'years');

var months = a.diff(b, 'months');
b.add(months, 'months');

var days = a.diff(b, 'days');

console.log(years + ' years ' + months + ' months ' + days + ' days');
// 8 years 5 months 2 days

Я не знаю лучшего, встроенного способа достижения этого, но этот метод работает хорошо.

Ответ 2

Moment.js также имеет duration объект. Момент определяется как единая точка во времени, тогда как продолжительность определяется как время, которое в основном вы хотите.

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var diffDuration = moment.duration(a.diff(b));

console.log(diffDuration.years()); // 8 years
console.log(diffDuration.months()); // 5 months
console.log(diffDuration.days()); // 2 days

Что может предложить @Josh, но определенно не правильный способ вычисления разницы за 2 момента.

Ответ 3

Выше решение не работает с моментами 2.19.1

Затем со ссылкой Расчет даты соединения не работает с моментом 2.19.1 Я внедрил новое решение с последним решением для momentjs 2.19.1.

Необходимые пакеты npm:

" moment": "^ 2.19.4",

" moment-duration-format": "^ 1.3.0",

" react-moment": "^ 0.6.8",

импортировать следующее в реакциях:

 import moment from "moment";
 import Moment from "react-moment";
 import momentDurationFormatSetup from "moment-duration-format";

var DOJ = moment([work_data.joining_date]).format("YYYY,MM,DD");      
var today = moment().format("YYYY,MM,DD");      
var totalMonths =  parseInt(moment(today).diff(moment(DOJ), 'months'));      
var totalDuration = moment.duration(totalMonths, "months").format();      
if(totalDuration.search('1y') > -1) {
   totalDuration = totalDuration.replace("1y", "1 Year,");
} else {
   totalDuration = totalDuration.replace("y", " Years,");
}

if(totalDuration.search('1m') > -1){
  totalDuration = totalDuration.replace("1m", "1 Month");
} else {
  totalDuration = totalDuration.replace("m", " Months");
}

console.log(totalDuration);

Ответ 4

Это еще один ответ. Проверено с помощью калькулятора возраста

function calculateAge(){
    ageText = jQuery("#dob").closest(".form-group").find(".age-text");
    ageText.text("");
    level2.dob = jQuery("#dob").val();
    if(!level2.dob) return;
    level2.mdob= moment(level2.dob, 'DD-MM-YYYY');
    if(!level2.mdob.isValid()){
        alert("Invalid date format");
        return;
    }
    level2.targetDate = moment();//TODO: Fill in the target date
    level2.months = level2.targetDate.diff(level2.mdob, 'months'); // Calculate the months
    let years = parseInt(level2.months/12); // A year has 12 months irrespective or leap year or not
    let balanceMonths = level2.months%12; // The balance gives the number of months 
    let days;
    if(!balanceMonths){ // If no balance months, then the date selected lies in the same month
        months = 0; // so months = 0
        days = level2.targetDate.diff(level2.mdob, 'days'); // only the days difference
    }else{
    months = balanceMonths;
    dob_date = level2.mdob.date();
    target_month = level2.targetDate.month();
    construct_date = moment().month(target_month).date(dob_date);
    days = level2.targetDate.diff(construct_date, 'days')+1; // There might be one day missed out. Not sure on UTC
}

ageText = years +" years " + months+ " months " + days +" days";
}

Ответ 5

Я только что преобразовал ответ Джоша Крозье в функцию и добавил часы, минуты и секунды тоже.

 function diffYMDHMS(date1, date2) {

    let years = date1.diff(date2, 'year');
    date2.add(years, 'years');

    let months = date1.diff(date2, 'months');
    date2.add(months, 'months');

    let days = date1.diff(date2, 'days');
    date2.add(days, 'days');

    let hours = date1.diff(date2, 'hours');
    date2.add(hours, 'hours');

    let minutes = date1.diff(date2, 'minutes');
    date2.add(minutes, 'minutes');

    let seconds = date1.diff(date2, 'seconds');

    console.log(years + ' years ' + months + ' months ' + days + ' days ' + hours + ' 
    hours ' + minutes + ' minutes ' + seconds + ' seconds'); 

    return { years, months, days, hours, minutes, seconds};
}

Ответ 6

Использовать этот

  var totalDays = endDate.diff(startDate, "days");