mcacorner
mcacorner

Reputation: 1274

javascript: Calculate difference between two dates

I want to find difference between two Dates. For that I did subtract one Date object from another Date object. My code is as follows :

var d1 = new Date(); //"now"
var d2 = new Date(2012,3,17); // before one year
document.write("</br>Currrent date : "+d1);
document.write("</br>Other Date : "+d2);
document.write("</br>Difference : "+new Date(Math.abs(d1-d2)));

But the result is not as I expected:

Currrent date : Sun Feb 17 2013 02:58:16 GMT-0500 (EST)
Other Date : Sat Jan 21 2012 00:00:00 GMT-0500 (EST)
Difference : Thu Jan 28 1971 21:58:16 GMT-0500 (EST)

I want to calculate the (1 year) difference between them.

Thanks

Upvotes: 2

Views: 10314

Answers (4)

crackmigg
crackmigg

Reputation: 5891

So fundamentally the biggest exact date unit is a week which accounts for 7 * 86400 seconds. Months and Years are not exaclty defined. So assuming you want to say "1 Month ago" if the two dates are e.g. 5.1.2013 and 5.2.2013 or 5.2.2013 and 5.3.2013. And saying "1 Month and 1 day ago" if you have e.g. 5.1.2013 and 6.2.2013, then you would have to use a calculation like this:

// dateFrom and dateTo have to be "Date" instances, and to has to be later/bigger than from.
function dateDiff(dateFrom, dateTo) {
  var from = {
    d: dateFrom.getDate(),
    m: dateFrom.getMonth() + 1,
    y: dateFrom.getFullYear()
  };

  var to = {
    d: dateTo.getDate(),
    m: dateTo.getMonth() + 1,
    y: dateTo.getFullYear()
  };

  var daysFebruary = to.y % 4 != 0 || (to.y % 100 == 0 && to.y % 400 != 0)? 28 : 29;
  var daysInMonths = [0, 31, daysFebruary, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  if (to.d < from.d) {
    to.d   += daysInMonths[parseInt(to.m)];
    from.m += 1;
  }
  if (to.m < from.m) {
    to.m   += 12;
    from.y += 1;
  }

  return {
    days:   to.d - from.d,
    months: to.m - from.m,
    years:  to.y - from.y
  };
}
// Difference from 1 June 2016 to now
console.log(dateDiff(new Date(2016,5,1), new Date()));

As I said, it gets tricky ;)

Upvotes: 4

user3519216
user3519216

Reputation: 385

Are you looking for this?

Math.ceil((new Date(2012, 11, 23) - new Date(2012, 11, 21)) / 864000) + 1

Upvotes: 0

James
James

Reputation: 22247

If you need to be fairly accurate I suggest using days as your unit. Years have a variable number of days so do months, so saying "1 month" or "1 year" can mean different #s of days.

var d1 = new Date(); //"now"
var d2 = new Date(2012,3,17); // before one year
var msPerDay = 1000*60*60*24;
document.write( ((d1 - d2) / msPerDay).toFixed(0) + " days ago");

Upvotes: 4

Exception
Exception

Reputation: 8379

Are you looking for this?

 Math.ceil((new Date(2012, 11, 23) - new Date(2012, 11, 21)) / 86400000) + 1

Upvotes: 2

Related Questions