Moment.js-在几年、几个月和几天的两个生日中获得差异

Moment.js - Get difference in two birthdays in years, months and days

本文关键字:生日 两个 js- 几年 Moment 几个月 几天      更新时间:2023-09-26

我正在寻找一种使用momentjs解析两个日期的方法,以显示差异。

我想要它的格式:"X年,Y月,Z天"。

多年来,库和模运算器一直运行良好。但对于那些日子来说,这是另一个故事,因为我不想一个人处理闰年和所有这些。到目前为止,我脑子里的逻辑是:

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;

您可以获得年份差异,并将其添加到初始日期;然后得到以月为单位的差额,并将其再次添加到初始日期中。

通过这样做,您现在可以很容易地获得天数的差异,并避免使用模运算符。

此处示例

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

我不知道有什么更好的内置方法可以实现这一点,但这种方法似乎效果很好。

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的建议可能有效,但绝对不是计算两个瞬间差异的正确方法。

我刚刚将@Josh Crozier的答案转换为一个函数,并添加了小时分钟

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

以上解决方案不适用于momentjs 2.19.1

然后,参考加入日期计算不适用于时刻2.19.1,我已经用时刻2.19.1的最新解决方案实现了新的解决方案

所需npm包

"时刻":"^2.19.4",

"时刻持续时间格式":"^1.3.0",

"反应时刻":"^0.6.8",

在reactjs中导入以下内容

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

这里提供的所有解决方案在某些测试用例中都失败了。所以我对公认的答案做了一些修改。

function getYMD(date1, date2) {
    const a = moment(date1);
    const b = moment(date2);
    var years = a.diff(b, 'year');
    b.add(years, 'years');
    const noOfDaysInb = b.daysInMonth();
    const noOfDaysIna = a.daysInMonth();
    let months = 0;
    if (noOfDaysInb > noOfDaysIna) {
        months = b.diff(a, "months");
        a.add(months, "months");
    } else {
        months = a.diff(b, 'months');
        b.add(months, 'months');
    }
    var days = a.diff(b, 'days');
    return {
        years: Math.abs(years),
        months: Math.abs(months),
        days: Math.abs(days),
    }
}

这是我能想到的最好的答案。

这是另一个答案。使用年龄计算器进行验证

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

使用此

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