如何使用moment.js获得年,月和日的2个日期之间的差异

时间:2014-09-26 16:12:42

标签: javascript momentjs

如何使用moment.js获得年,月和日的2个日期之间的差异? 例如 4/5/2014 & 2/22/2013 应计算为 1年,1个月和14天

3 个答案:

答案 0 :(得分:14)

Moment.js无法直接处理此方案。它允许您获取两个时刻之间的差异,但结果是经过的持续时间(以毫秒为单位)。 Moment确实有一个Duration对象,但它将一个月定义为30天的固定单位 - 我们知道情况并非总是如此。

幸运的是,已经创建了一个名为"Precise Range"的插件,它做了正确的事情。查看the source,它会执行与torazaburo's answer类似的操作 - 但它会恰当地说明要调整的月份天数。

在你的项目中包含了moment.js和这个插件(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天"

答案 1 :(得分:5)

你几乎不需要时刻。

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天,它是2月的剩余6天和4月的前5天,所以它是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.");

答案 2 :(得分:0)

这对我有用。经过年龄计算器验证。

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