JavaScript从开始日期开始计算年数和天数

时间:2012-07-19 22:26:37

标签: javascript date leap-year

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

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

3 个答案:

答案 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个月,直到一年过去。这是为了计算整整一年。然后,我将最后一个不是当前日期的“生日”设置为信息,并使用与该日期和当前日期相关的标准日期差异。

它有魅力。

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