我有个人出生的日期,我需要用JavaScript或jQuery左右计算,从出生日期到现在为止的几年,几天。
结果可能是20年,89天。
我需要得到与维基百科一样的“年龄年龄”功能相同的结果,因为它需要闰年而不是。到目前为止,我得到了有效的代码,但在某些情况下错误了1天。我的职责是:
function DateDiff(date1, date2){
var res=((date1.getTime() - date2.getTime())/1000/60/60/24)-offset_d;
var full_days=Math.floor(res/365.25);
var f1=Math.round((res%365.25))
return full_days + " years, " +f1 + " days" ; }
感谢您的帮助,我这样做了好几天。
答案 0 :(得分:1)
我写了以下一段时间后,你应该能够调整它来完成这项工作:
// Given a date object, calcualte the number of
// days in the month
function daysInMonth(x) {
var d = new Date(x);
d.setDate(1);
d.setMonth(d.getMonth() + 1);
d.setDate(0);
return d.getDate();
}
/* For person born on birthDate, return their
** age on datumDate.
**
** Don't modify original date objects
**
** tDate is used as adding and subtracting
** years, months and days from dates on 29 February
** can affect the outcome,
**
** e.g.
**
** 2000-02-29 + 1 year => 2001-03-01
** 2001-03-01 - 1 year => 2000-03-01 so not symetric
**
** Note: in some systems, a person born on 29-Feb
** will have an official birthday on 28-Feb, other
** systems will have official birthday on 01-Mar.
*/
function getAge(birthDate, datumDate) {
// Make sure birthDate is before datumDate
if (birthDate - datumDate > 0) return null;
var dob = new Date(+birthDate),
now = new Date(+datumDate),
tDate = new Date(+dob),
dobY = dob.getFullYear(),
nowY = now.getFullYear(),
years, months, days;
// Initial estimate of years
years = nowY - dobY;
dobY = (dobY + years);
tDate.setYear(dobY);
// Correct if too many
if (now < tDate) {
--years;
--dobY;
}
dob.setYear(dobY);
// Repair tDate
tDate = new Date(+dob);
// Initial month estimate
months = now.getMonth() - tDate.getMonth();
// Adjust if needed
if (months < 0) {
months = 12 + months;
} else if (months == 0 && tDate.getDate() > now.getDate()) {
months = 11;
}
tDate.setMonth(tDate.getMonth() + months);
if (now < tDate) {
--months;
dob.setMonth(tDate.getMonth() - 1);
}
// Repair tDate
tDate = new Date(+dob);
// Initial day estimate
days = now.getDate() - tDate.getDate();
// Adjust if needed
if (days < 0) {
days = days + daysInMonth(tDate);
}
dob.setDate(dob.getDate() + days);
if (now < dob) {
--days;
}
return years + 'y ' + months + 'm ' + days + 'd';
}
function parseDMY(s) {
var b = s.split(/\D/);
var d = new Date(b[2], --b[1], b[0]);
return d && d.getMonth() == b[1]? d : new Date(NaN);
}
window.onload = function() {
var form = document.forms['ageCalc'];
form.onsubmit = function() {
var dob = parseDMY(form.dob.value);
form.age.value = isNaN(dob)? 'Invalid date' : getAge(dob, new Date());
return false;
}
}
<form id="ageCalc">
<table>
<tr>
<td>Date of Birth (d/m/y)
<td><input name="dob">
<tr>
<td>Age today (y, m, d)
<td><input readonly name="age">
<tr>
<td><input type="reset">
<td><input type="submit" value="Calculate Age">
</table>
</form>
这是一个连续几年和几天的版本:
function diffInYearsAndDays(startDate, endDate) {
// Copy and normalise dates
var d0 = new Date(startDate);
d0.setHours(12,0,0,0);
var d1 = new Date(endDate);
d1.setHours(12,0,0,0);
// Make d0 earlier date
// Can remember a sign here to make -ve if swapped
if (d0 > d1) {
var t = d0;
d0 = d1;
d1 = t;
}
// Initial estimate of years
var dY = d1.getFullYear() - d0.getFullYear();
// Modify start date
d0.setYear(d0.getFullYear() + dY);
// Adjust if required
if (d0 > d1) {
d0.setYear(d0.getFullYear() - 1);
--dY;
}
// Get remaining difference in days
var dD = (d1 - d0) / 8.64e7;
// If sign required, deal with it here
return [dY, dD];
}
alert(diffInYearsAndDays(new Date(1957, 11, 4), new Date(2012, 11, 2))); // [54, 364]
答案 1 :(得分:0)
你可以自己动手......但我强烈推荐像Moment.js这样的东西。它是一个可靠的库,已经在现场证明可以像这样计算数学。它只有4k,所以我认为你的尺寸也会很好。
答案 2 :(得分:-1)
最终解决方案与任何图书馆无关,而与逻辑无关。我将开始时间和分钟设置为与当前时间和分钟相同。然后我继续增加12个月,直到一年过去。这是为了计算整整一年。然后,我将最后一个不是当前日期的“生日”设置为信息,并使用与该日期和当前日期相关的标准日期差异。
它有魅力。
非常感谢大家的帮助。它帮助我专注于主题。