400

I have two input dates taking from Date Picker control. I have selected start date 2/2/2012 and end date 2/7/2012. I have written following code for that.

I should get result as 6 but I am getting 5.

function SetDays(invoker) {   
    var start = $find('<%=StartWebDatePicker.ClientID%>').get_value();
    var end = $find('<%=EndWebDatePicker.ClientID%>').get_value();

    var oneDay=1000 * 60 * 60 * 24;
    var difference_ms = Math.abs(end.getTime() - start.getTime())
    var diffValue = Math.round(difference_ms / oneDay);
}

Can anyone tell me how I can get exact difference?

Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
Vaibhav Deshmukh
  • 4,249
  • 3
  • 18
  • 16

8 Answers8

887

http://momentjs.com/ or https://date-fns.org/

From Moment docs:

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days')   // =1

or to include the start:

a.diff(b, 'days')+1   // =2

Beats messing with timestamps and time zones manually.

Depending on your specific use case, you can either

  1. Use a/b.startOf('day') and/or a/b.endOf('day') to force the diff to be inclusive or exclusive at the "ends" (as suggested by @kotpal in the comments).
  2. Set third argument true to get a floating point diff which you can then Math.floor, Math.ceil or Math.round as needed.
  3. Option 2 can also be accomplished by getting 'seconds' instead of 'days' and then dividing by 24*60*60.
Supr
  • 18,572
  • 3
  • 31
  • 36
  • 47
    moment.js will give negative value if a < b. So, more robust calculation would be: ```Math.abs(a.diff(b, 'days'))+1``` – Vinay Sahni Apr 15 '16 at 15:16
  • 31
    Be aware to ignore the time-part - or else you would get different results for the same date but with different times (like from a date picker control). use moment(someDate).startOf('day') to explicitly set the time part to 00:00:00 before performing a diff (or any other operations that are sensitive to the time-part of the Date/moment object) – kotpal Aug 02 '17 at 05:07
  • This works but it does not take the time component into account. Trying to diff between the following two pairs: (a="2017-12-24T00:00:00Z" and "b=2017-12-31T23:59:59Z") and (a="2017-12-24T23:00:00Z" and b="2017-12-31T23:59:59Z"). return b.diff(a, 'days') <= 7; both return true. Is there a way to include the time component in the diff? – Roobie Oct 09 '17 at 03:36
  • @Roobie Updated the answer. – Supr Oct 09 '17 at 07:57
  • 1
    +1 for startOf() and endOf(). I've used this library for a few years and never noticed them before. I always did +1. – Mike Devenney Jan 25 '18 at 16:53
  • @Supr Option 3 can not work in case if day light saving transition day falls in between a and b, in such cases Moment take care of day light saving transition using browser machine culture – Abdul Qadir Memon Apr 11 '18 at 10:35
  • 4
    Be aware that `startOf` mutates the moment. If you don't want that, then do `a.clone().startOf('day').diff(b.clone().startOf('day'))`. – HRJ Jan 01 '19 at 13:45
  • Documentation: https://momentjs.com/docs/#/displaying/difference/ – skantus Mar 12 '20 at 11:06
89

If you are using moment.js you can do it easily.

var start = moment("2018-03-10", "YYYY-MM-DD");
var end = moment("2018-03-15", "YYYY-MM-DD");

//Difference in number of days
moment.duration(start.diff(end)).asDays();

//Difference in number of weeks
moment.duration(start.diff(end)).asWeeks();

If you want to find difference between a given date and current date in number of days (ignoring time), make sure to remove time from moment object of current date as below

moment().startOf('day')

To find difference between a given date and current date in number of days

var given = moment("2018-03-10", "YYYY-MM-DD");
var current = moment().startOf('day');

//Difference in number of days
moment.duration(given.diff(current)).asDays();
Rakesh Prajapati
  • 1,078
  • 8
  • 17
  • 7
    asDays() returned me some values with decimals. I use `current.diff(given, 'days')` so it rounds up. – Vincent Mar 22 '19 at 13:37
  • @Vincent it seems that your are using this the wrong way. this is definitively the more clean solution the result is right compared to the answer of @Supr in which a `1` is lost – Nwawel A Iroume Nov 20 '19 at 22:55
22

Try this Using moment.js (Its quite easy to compute date operations in javascript)

firstDate.diff(secondDate, 'days', false);// true|false for fraction value

Result will give you number of days in integer.

Sumit
  • 623
  • 6
  • 5
  • 2
    here is the signature : moment().diff(Moment|String|Number|Date|Array, String, Boolean); – Sumit May 17 '18 at 11:43
19

Try:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);
Paul Richter
  • 10,908
  • 10
  • 52
  • 85
Richard
  • 1,148
  • 3
  • 18
  • 33
  • I think that's basically right but isn't it essentially the same as what's in the OP? – Pointy Feb 03 '12 at 14:15
  • Because of the way he wrote it I didn't notice, but yeah, pretty much! :P – Richard Feb 03 '12 at 14:22
  • 11
    I don't like *magic numbers*.. it would be better if that number was broken down to a self-explanatory equation – vsync Sep 28 '18 at 15:11
  • This calculation is wrong when crossing boundaries of daylight savings time, because those days have either 23 hours or 25 hours in them. – hlynbech Mar 26 '21 at 14:39
16

This works for me:

const from = '2019-01-01';
const to   = '2019-01-08';

Math.abs(
    moment(from, 'YYYY-MM-DD')
      .startOf('day')
      .diff(moment(to, 'YYYY-MM-DD').startOf('day'), 'days')
  ) + 1
);
Martin Kravec
  • 187
  • 2
  • 10
5

I made a quick re-usable function in ES6 using Moment.js.

const getDaysDiff = (start_date, end_date, date_format = 'YYYY-MM-DD') => {
  const getDateAsArray = (date) => {
    return moment(date.split(/\D+/), date_format);
  }
  return getDateAsArray(end_date).diff(getDateAsArray(start_date), 'days') + 1;
}

console.log(getDaysDiff('2019-10-01', '2019-10-30'));
console.log(getDaysDiff('2019/10/01', '2019/10/30'));
console.log(getDaysDiff('2019.10-01', '2019.10 30'));
console.log(getDaysDiff('2019 10 01', '2019 10 30'));
console.log(getDaysDiff('+++++2019!!/###10/$$01', '2019-10-30'));
console.log(getDaysDiff('2019-10-01-2019', '2019-10-30'));
console.log(getDaysDiff('10-01-2019', '10-30-2019', 'MM-DD-YYYY'));

console.log(getDaysDiff('10-01-2019', '10-30-2019'));
console.log(getDaysDiff('10-01-2019', '2019-10-30', 'MM-DD-YYYY'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>
Phil
  • 795
  • 1
  • 5
  • 15
4

Also you can use this code: moment("yourDateHere", "YYYY-MM-DD").fromNow(). This will calculate the difference between today and your provided date.

David
  • 1,365
  • 14
  • 23
0
// today
const date = new Date();

// tomorrow
const nextDay = new Date(new Date().getTime() + 24 * 60 * 60 * 1000);

// Difference in time
const Difference_In_Time = nextDay.getTime() - date.getTime();

// Difference in Days 
const Difference_In_Days = Difference_In_Time / (1000 * 3600 * 24);
General Grievance
  • 4,555
  • 31
  • 31
  • 45
Moctar Yonli
  • 107
  • 5