Je cherche un moyen d'utiliser moment pour analyser deux dates, pour montrer la différence.
Je veux l'avoir sur le format: "X années, Y mois, Z jours".
Depuis des années et des mois, la bibliothèque momentanée et l’opérateur modulo travaillent à Nice. Mais pour les jours, c’est un autre récit, car je ne veux pas gérer les années bissextiles et tout cela seul. Jusqu'ici la logique que j'ai dans ma tête est la suivante:
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;
Vous pouvez obtenir la différence en années et l'ajouter à la date initiale; puis obtenez la différence en mois et ajoutez-la à la date initiale.
Ce faisant, vous pouvez maintenant facilement obtenir la différence en jours et éviter d'utiliser également l'opérateur 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
Je ne suis pas au courant d'un meilleur moyen intégré d'y parvenir, mais cette méthode semble bien fonctionner.
Moment.js a également duration
object. Un moment est défini comme un point dans le temps, alors que la durée est définie comme une durée qui correspond essentiellement à ce que vous voulez.
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
Ce que @Josh suggère peut fonctionner, mais ce n’est certainement pas la bonne façon de calculer la différence en 2 moments.
Je viens de convertir la réponse answer de Josh Crozier en une fonction et d'ajouter heures, minutes et secondes également.
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};
}
La solution ci-dessus ne fonctionne pas avec momentjs 2.19.1
Puis avec la référence de La date de jonction du calcul ne fonctionne pas avec le moment 2.19.1 j’ai implémenté une nouvelle solution avec dernière solution pour momentjs 2.19.1.
Paquets npm requis:
" moment ": "^ 2.19.4",
" moment-durée-format ": "^ 1.3.0",
" réagir-moment ": "^ 0.6.8",
import suivant dans les réactions:
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);
Ceci est une autre réponse. Vérifié avec Age Calculator
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";
}