JavaScript calculate years and days from start date

我的梦境 提交于 2019-12-12 05:49:46

问题


I have date when someone is born, and I need to calculate with JavaScript or jQuery or so, how many years, days since birth date, until now.

So result can be like 20 years, 89 days.

I need to have same results as Wikipedia does with their function of "age in years", as it takes leap years in account and what not. So far I got code that works, but in some cases makes mistake of 1 day. My function is:

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" ; }

Thanks for your help, I am doing this for days.


回答1:


You could roll your own... but I would highly recommend something like Moment.js. It is a solid library that has been proven in the field for calculating Math like this. It is only 4k, so I think you will be fine on size also.




回答2:


I wrote the following a while back, you should be able to tweak it to do the job:

// 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>

Here's a straight years and days version:

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]



回答3:


At end solution was not related to any libraty but logic. I set start age hours and minutes to same as current day hour and minute. Then I keep adding 12 months until year is over current. That was for counting full years. I then set last "birthday" that is not over current date to be info to take and use standard date difference in days against that date and current date.

It worked as charm.

Thanks everyone on great help. It helped me focus on topic.



来源:https://stackoverflow.com/questions/11570232/javascript-calculate-years-and-days-from-start-date

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!