JavaScript Calculate Years And Days From Start Date
Solution 1:
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]
Solution 2:
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.
Solution 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.
Post a Comment for "JavaScript Calculate Years And Days From Start Date"