webentwicklung-frage-antwort-db.com.de

Moment.js - Erhalten Sie die Differenz zwischen zwei Geburtstagen in Jahren, Monaten und Tagen

Ich suche nach einer Möglichkeit, momentjs zu verwenden, um zwei Daten zu analysieren, um den Unterschied zu zeigen.

Ich möchte es auf dem Format haben: "X Jahre, Y Monate, Z Tage".

Für die Jahre und Monate arbeitet der Moment, in dem Bibliothek und Modulo-Operator Nizza arbeiten. Aber für die Tage ist es eine andere Geschichte, da ich mit Schaltjahren und all dem nicht alleine umgehen möchte. Bisher ist die Logik, die ich in meinem Kopf habe, folgende: 

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;

Sie können den Unterschied in Jahren ermitteln und dem ursprünglichen Datum hinzufügen. dann erhalten Sie die Differenz in Monaten und addieren Sie diese wieder zum ursprünglichen Datum. 

Auf diese Weise können Sie jetzt ganz einfach den Unterschied in Tagen feststellen und die Verwendung des Modulo-Operators vermeiden.

Beispiel hier

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

Ich kenne keinen besseren, integrierten Weg, um dies zu erreichen, aber diese Methode scheint gut zu funktionieren.

28
Josh Crozier

Moment.js hat auch duration object. Ein Moment ist als einzelner Zeitpunkt definiert, während die Dauer als eine Zeitdauer definiert wird, die im Grunde das ist, was Sie wollen.

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

Was @Josh vorschlägt, mag zwar funktionieren, ist aber definitiv nicht der richtige Weg, um die Differenz in zwei Sekunden zu berechnen.

23
Kunal Kapadia

Ich habe gerade Josh Croziers answer in eine Funktion umgewandelt und Stunden, Minuten und Sekunden hinzugefügt.

 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};
}
0
Muneeb JS

Die obige Lösung funktioniert nicht mit momentjs 2.19.1

Dann mit Bezug auf Date of Joining Berechnung funktioniert nicht mit Moment 2.19.1 Ich habe eine neue Lösung mit latest Lösung für Momentjs 2.19.1 implementiert.

Erforderliche npm-Pakete:

" moment ": "^ 2.19.4",

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

" reaktionsmoment ": "^ 0.6.8",

import folgendes in reacts:

 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);
0
Chandresh

Dies ist eine weitere Antwort. Verifiziert mit dem Altersrechner

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";
}