您的diff
计算将为您提供两个日期之间的天数。它将考虑闰年,因此恰好在 4 年内它将产生(365 * 4) + 1
天数。
它也会计算部分天数,所以如果date
参数是昨天中午,今天是早上 6 点,那么diff
将是0.75
.
如何将数天转换为数年取决于您自己。每年使用 365、365.242 或 365.25 天在摘要中都是合理的。但是,由于您是根据生日计算人们的年龄,所以我会这样做http://jsfiddle.net/OldPro/hKyBM/:
function noon(date) {
// normalize date to noon that day
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12, 0, 0, 0);
}
// Takes a Date
function getAge(date) {
var now = noon(new Date()),
birthday = noon(date),
thisBirthday = new Date(birthday),
prevBirthday,
nextBirthday,
years,
partYear,
msInYear;
thisBirthday.setFullYear(now.getFullYear());
if (thisBirthday > now) { // not reached birthday this year
nextBirthday = thisBirthday;
prevBirthday = new Date(thisBirthday);
prevBirthday.setFullYear(now.getFullYear() - 1);
}
else {
nextBirthday = new Date(thisBirthday);
nextBirthday.setFullYear(now.getFullYear() + 1);
prevBirthday = thisBirthday;
}
years = prevBirthday.getFullYear() - birthday.getFullYear();
msInYear = nextBirthday - prevBirthday;
partYear = (now - prevBirthday) / msInYear;
return years + partYear
}
换句话说,我将小数年计算为自上一个生日以来的天数除以上一个生日和下一个生日之间的天数。我想这就是大多数人对生日和年份的看法。
注意:将日期字符串转换为日期时,您可能会遇到时区问题。像“2013-05-14”这样的短 ISO 8601 日期被解释为 UTC 午夜,这使得该日期为 5 月 13 日,而不是美国的 5 月 14 日,以及其他任何具有负 UTC 偏移量的地方。所以要小心。