如何使用moment.js获得年,月和日的2个日期之间的差异? 例如 4/5/2014 & 2/22/2013 应计算为 1年,1个月和14天。
答案 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";
}