0

我有某人出生的日期,我需要用 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" ; }

感谢您的帮助,我已经这样做了好几天了。

4

3 回答 3

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]
于 2012-07-20T00:55:54.137 回答
0

你可以自己动手……但我强烈推荐Moment.js 之类的东西。它是一个可靠的库,已在该领域证明可以像这样计算数学。它只有 4k,所以我认为你的尺寸也可以。

于 2012-07-19T22:31:51.757 回答
-1

最终解决方案与任何库无关,而是与逻辑有关。我将开始年龄小时和分钟设置为与当天的小时和分钟相同。然后我继续增加 12 个月,直到一年结束。那是为了计算整年。然后,我将不超过当前日期的最后一个“生日”设置为获取和使用标准日期差异的信息,以针对该日期和当前日期的天数。

它起到了魅力的作用。

感谢大家的大力帮助。它帮助我专注于主题。

于 2012-07-23T01:52:34.843 回答