我为应用程序中的每个用户指定了生日。例如。格式为29/01/2015
目前,我的代码计算从今天的日期到提供的出生日期的年份:
((new Date((new Date().getTime() - new Date(user.dob).getTime())).getFullYear()) - 1970)
对于上面的示例,由于3
已经三年了,因此它将检索数字29/01/2015
。
如果年份低于1
,那么获得月份的最佳优化是什么?
例如,对于此日期:21/03/2018
,由于还没有整整一年,我的代码将返回0。我如何优化逻辑以检索6 months
到今天(21/09/2018
)和21/03/2018
之间的时间?
PS 。我想避免使用任何库。
答案 0 :(得分:1)
我会使用momentjs是一个很棒的库来存放与日期时间相关的内容。无论如何,我的方法是 -计算月份 -然后检查超过12个月的月数,然后我从这几个月中提取数年 -除非显示月份
let months = moment('2011-06-11').diff(moment('2011-04-11'), 'month', true);
if (months >= 12) {
console.log('years:', (months - (months %12))/12 );
} else {
console.log('only months', parseInt(months));
}
使用纯js:Live sample with pure JS
let dateFrom = new Date('2011-04-11');
let dateTo = new Date('2011-06-11');
let months = dateTo.getMonth() - dateFrom.getMonth() + (12 * (dateTo.getFullYear() - dateFrom.getFullYear()));
if (months >= 12) {
console.log('years:', (months - (months %12))/12 );
} else {
console.log('only months', parseInt(months));
}
答案 1 :(得分:1)
我最近在我的一个项目中使用了以下代码,它可以正常工作。注意,我也使用的是momentjs,它是免费的,可以下载和使用开源代码。
这是示例jsfiddle链接http://jsfiddle.net/n70vdz1k/
var dob = "13-05-1981";
mdob = moment(dob, 'DD-MM-YYYY'); // date of birth
if (!mdob.isValid()) {
alert("Invalid date format");
return;
}
targetDate = moment(); //this will give today's date
months = targetDate.diff(mdob, 'months');
let years = parseInt(months / 12);
let balanceMonths = months % 12;
let days;
if (!balanceMonths) {
months = 0;
// days = targetDate.diff(mdob, 'days');
dob_date = mdob.date();
target_month = targetDate.month();
construct_date = moment().month(target_month).date(dob_date);
days = targetDate.diff(construct_date, 'days');
if(days < 0){
days = 30 + days;
}
} else {
months = balanceMonths;
dob_date = mdob.date();
target_month = targetDate.month();
construct_date = moment().month(target_month).date(dob_date);
days = targetDate.diff(construct_date, 'days');
if(days < 0){
days = 30 + days;
}
}
console.log("months", months)
console.log("years", years)
console.log("days", days)
答案 2 :(得分:1)
您可以自己计算出差异:
function diffYears(d) {
return Math.floor((Date.now() - new Date(d)) / 12 / 30 / 24 / 3600 / 1000);
}
function diffMonths(d) {
return Math.floor((Date.now() - new Date(d)) / 30 / 24 / 3600 / 1000);
}
console.log(diffMonths('2018-03-21'), diffYears('2018-03-21'));
console.log(diffMonths('2017-03-21'), diffYears('2017-03-21'));
console.log(diffMonths('2016-03-21'), diffYears('2016-03-21'));