Skip to content

Instantly share code, notes, and snippets.

@miguelmota
Last active February 7, 2024 23:43
Show Gist options
  • Save miguelmota/7905510 to your computer and use it in GitHub Desktop.
Save miguelmota/7905510 to your computer and use it in GitHub Desktop.
Get dates in between two dates with JavaScript.
// Returns an array of dates between the two dates
function getDates (startDate, endDate) {
const dates = []
let currentDate = startDate
const addDays = function (days) {
const date = new Date(this.valueOf())
date.setDate(date.getDate() + days)
return date
}
while (currentDate <= endDate) {
dates.push(currentDate)
currentDate = addDays.call(currentDate, 1)
}
return dates
}
// Usage
const dates = getDates(new Date(2013, 10, 22), new Date(2013, 11, 25))
dates.forEach(function (date) {
console.log(date)
})
@jacintoface
Copy link

Thank You very much

@hriziya
Copy link

hriziya commented Apr 25, 2018

Thanks @Ben52

@cyberundertakor
Copy link

Thanks @Ben52

@aalexgabi
Copy link

aalexgabi commented May 18, 2018

My version which strips hours, minutes, seconds etc. and does not declare an inline function:

// Returns an array of dates between the two dates
const getDatesBetween = (startDate, endDate) => {
    const dates = [];

    // Strip hours minutes seconds etc.
    let currentDate = new Date(
        startDate.getFullYear(),
        startDate.getMonth(),
        startDate.getDate()
    );

    while (currentDate <= endDate) {
        dates.push(currentDate);

        currentDate = new Date(
            currentDate.getFullYear(),
            currentDate.getMonth(),
            currentDate.getDate() + 1, // Will increase month if over range
        );
    }

    return dates;
};

// Usage
const dates = getDates(new Date(2018, 0, 30, 11, 30), new Date(2018, 2, 2, 23, 59, 59)); 

console.log(dates);

@hieudang59
Copy link

Thanks @aalexgabi, it resolved my problem 💯

@dibyasipu
Copy link

dibyasipu commented Jul 17, 2018

Help me sir,
how to check between two date range???
Example

from date=03-07-2018
to date=13-07-2018

how to check date range between them in javascript

Copy link

ghost commented Jul 25, 2018

@sibelius can you elaborate on how you use that function? For instance, it looks like you have another file you are including. What does that look like? Thanks in advance!

@wadadaaa
Copy link

import moment from 'moment';
getStandAge = startDate => { const age = moment().diff(startDate, 'months'); return isNaN(age) ? null : age; };

@pumpin101
Copy link

pumpin101 commented Oct 29, 2018

Please i would need help, i would like to do this using two date time picker and insert the dates in between the date time picker in a database but i dont know how to go about this in vb.net. Someone should help me please

@pumpin101
Copy link

I made something more generic

it uses date-fns and does not mutate the array

import { addDays, addMonths, differenceInDays, differenceInMonths  } from 'date-fns';

import { PERIOD } from './PeriodEnumType';

export function dateRange(startDate, endDate, interval) {
  if (interval === PERIOD.DAY) {
    const days = differenceInDays(endDate, startDate);

    return [...Array(days+1).keys()].map((i) => addDays(startDate, i));
  }

  if (interval === PERIOD.MONTH) {
    const months = differenceInMonths(endDate, startDate);

    return [...Array(months+1).keys()].map((i) => addMonths(startDate, i));
  }
}

Can u help using two date time picker and insert the dates in a database in vb.net

@zeekhan90
Copy link

Worked Perfectly.... thanks :-)

@nlt2390
Copy link

nlt2390 commented Nov 13, 2018

Here's a function to get a range of dates, split up by any key, ex. month, day, year, etc.

const moment = require('moment');

function getRangeOfDates(start, end, key, arr = [start.startOf(key)]) {
  
  if(start.isAfter(end)) throw new Error('start must precede end')
  
  const next = moment(start).add(1, key).startOf(key);
  
  
  if(next.isAfter(end, key)) return arr;
  

  return getRangeOfDates(next, end, key, arr.concat(next));
  
}

So if I wanted to get an array of months from the start of the year until a year from now, I would go:

const begin = moment().startOf('year')
const end = moment().add(1, 'year')

getRangeOfDates(begin, end, 'month');

Which would return:

[ moment("2017-01-01T00:00:00.000"),
  moment("2017-02-01T00:00:00.000"),
  moment("2017-03-01T00:00:00.000"),
  moment("2017-04-01T00:00:00.000"),
  moment("2017-05-01T00:00:00.000"),
  moment("2017-06-01T00:00:00.000"),
  moment("2017-07-01T00:00:00.000"),
  moment("2017-08-01T00:00:00.000"),
  moment("2017-09-01T00:00:00.000"),
  moment("2017-10-01T00:00:00.000"),
  moment("2017-11-01T00:00:00.000"),
  moment("2017-12-01T00:00:00.000"),
  moment("2018-01-01T00:00:00.000"),
  moment("2018-02-01T00:00:00.000"),
  moment("2018-03-01T00:00:00.000"),
  moment("2018-04-01T00:00:00.000"),
  moment("2018-05-01T00:00:00.000"),
  moment("2018-06-01T00:00:00.000"),
  moment("2018-07-01T00:00:00.000"),
  moment("2018-08-01T00:00:00.000"),
  moment("2018-09-01T00:00:00.000") ]

Thanks a lot

@nivduran
Copy link

It works but I have a problem with the month.
I run it like that:

var dates = getDates(new Date(2019,04,16), new Date(2019,04,17));                                                                                                           
dates.forEach(function(date) {
  console.log(date);
});

And the result is:

Thu May 16 2019 00:00:00 GMT+0300 (Israel Daylight Time)
Fri May 17 2019 00:00:00 GMT+0300 (Israel Daylight Time)

I received May instead of April, why? What am I missing?

@sgerin
Copy link

sgerin commented Apr 17, 2019

Hi @nivduran. When using the Date constructor like that:
new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);
keep in mind that the monthIndex parameter is 0-based. This means that January = 0 and December = 11.
In your case, you used 4 as the monthIndex parameter, which means the fifth month of the year which is May.

@shippudenmadara
Copy link

Thanks @aalexgabi

@generalistcodes
Copy link

How about filling missing dates inside arrays

var array=[
{date:"2016-11-17T00:00:00"}, //start
{date:"2016-11-19T00:00:00"},
{date:"2016-11-18T00:00:00"},
{date:"2016-11-21T00:00:00"},
{date:"2016-11-22T00:00:00"},
{date:"2016-11-23T00:00:00"},
{date:"2017-11-27T00:00:00"},//end
];

Actually very useful for charts that has missing data.

@antonybergeot
Copy link

Very good, thank you sir!

@MVMurrell
Copy link

MVMurrell commented Sep 6, 2019

if you are looking for specific days of the week this will give them to you granted you provide a string array, otherwise, just dont use the if statement .

import * as moment from "moment";
import * as _ from 'lodash';

getDatesOfDays(startDate: moment.Moment, endDate: moment.Moment, dayArray: string[]) {
           var range = [];
           var dayNames = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
        while (moment(startDate) <= moment(endDate)){
            if (dayArray.includes(dayNames[startDate.day()])) {
                range.push(startDate.clone());
            }
            startDate.add(1 , 'days');
        }
        return range;
}

@ww610
Copy link

ww610 commented Oct 15, 2019

https://gist.github.com/miguelmota/7905510#file-getdates-js
It's very pretty.
I solved my problem.

@callmephil
Copy link

callmephil commented Oct 17, 2019

Node.js & ES6

get days diff between two dates and output all weekdays in between including start and end dates.
return an array of dates.

const moment = require("moment");
const getDatesDiff = (start_date, end_date, date_format = "YYYY-MM-DD") => {
  const getDateAsArray = date => {
    return moment(date.split(/\D+/), date_format);
  };
  const diff = getDateAsArray(end_date).diff(getDateAsArray(start_date), "days") + 1;
  const dates = [];
  for (let i = 0; i < diff; i++) {
    const nextDate = getDateAsArray(start_date).add(i, "day");
    const isWeekEndDay = nextDate.isoWeekday() > 5;
    if (!isWeekEndDay)
      dates.push(nextDate.format(date_format))
  }
  return dates;
};

Use:

const date_log = getDaysDiff ('2019-10-17',  '2019-10-25');
console.log(date_log);

output:

date_log = 
[ '2019-10-17',
  '2019-10-18',
  '2019-10-21',
  '2019-10-22',
  '2019-10-23',
  '2019-10-24',
  '2019-10-25'
]

@davidhoang101
Copy link

I tried this and it was returned wrong
getDates(new Date(2019,12,22), new Date(2020,1,7));

Wed Jan 22 2020 00:00:00 GMT+0700 (Indochina Time)
Thu Jan 23 2020 00:00:00 GMT+0700 (Indochina Time)
Jan 24 2020 00:00:00 GMT+0700 (Indochina Time)
Sat Jan 25 2020 00:00:00 GMT+0700 (Indochina Time)
Sun Jan 26 2020 00:00:00 GMT+0700 (Indochina Time)
Mon Jan 27 2020 00:00:00 GMT+0700 (Indochina Time)
Tue Jan 28 2020 00:00:00 GMT+0700 (Indochina Time)
Wed Jan 29 2020 00:00:00 GMT+0700 (Indochina Time)
Thu Jan 30 2020 00:00:00 GMT+0700 (Indochina Time)
Fri Jan 31 2020 00:00:00 GMT+0700 (Indochina Time)
Sat Feb 01 2020 00:00:00 GMT+0700 (Indochina Time)
Sun Feb 02 2020 00:00:00 GMT+0700 (Indochina Time)
Mon Feb 03 2020 00:00:00 GMT+0700 (Indochina Time)
Tue Feb 04 2020 00:00:00 GMT+0700 (Indochina Time)
Wed Feb 05 2020 00:00:00 GMT+0700 (Indochina Time)
Thu Feb 06 2020 00:00:00 GMT+0700 (Indochina Time)
Fri Feb 07 2020 00:00:00 GMT+0700 (Indochina Time)

@Muhammad-Wasi
Copy link

Thanks for the code.

@anoop0567
Copy link

Please provide code for getting hours in between two dates with JavaScript.

Example

let date1 = new Date(1582545600000) // 24th Feb 17:30
let date2 = new Date(1582574400000) // 25th Feb 01:30
getHourWiseDates(date1, date2);

Output
[ { start_hour: 1582545600000 // 24th Feb 17:30 end_hour: 1582547399099 // 24th Feb 17:59 }, { start_hour: 1582547400000 // 24th Feb 18:00 end_hour: 1582550999099 // 24th Feb 18:59 } ... ... ... { start_hour: 1582572600000 //25th Feb 01:00 end_hour: 1582574400000 // 25th Feb 01:30 } ]

@kuldeep-pixer
Copy link

Screenshot_1

i want this type of array like shortmonths name and years starting date is Sep 2017 to current months and year

@AntonOfTheWoods
Copy link

AntonOfTheWoods commented Nov 23, 2021

Using dayjs and accepting any of the dayjs supported types (from millisecond to year), in typescript and returning either Dates or numbers (unix timestamps in milliseconds)

export function dateRange(
  start: Date | number,
  end: Date | number,
  interval: "millisecond" | "second" | "minute" | "hour" | "day" | "week" | "month" | "year",
  asUnixTimestampsMS = false,
): (number | Date)[] {
  const startDate = dayjs(start);
  const endDate = dayjs(end);
  const diffInUnits = endDate.diff(startDate, interval)
  return Array.from(Array(diffInUnits + 1).keys()).map((i) => {
    return asUnixTimestampsMS ? startDate.add(i, interval).valueOf() : startDate.add(i, interval).toDate()
  });
}

@Blackie31
Copy link

I'm selected dates
24-01-2022
25-01-2022

but I get

Thu Feb 24 2022 00:00:00 GMT+0530 (India Standard Time)
Fri Feb 25 2022 00:00:00 GMT+0530 (India Standard Time)

and my code

var dests = getDates(new Date(des[2],des[1],des[0]), new Date(des1[2],des1[1],des1[0]));
dests.forEach(function(date) {
console.log(dests);
});
how to fix it?

@ekopras18
Copy link

Perfectly.. Thanks u bro

@ekopras18
Copy link

This for Get range dates, work for me

var start = '24-01-2022';
var end = '26-01-2022';
var dates = getDates(new Date(start), new Date(end));
// dates.forEach(function(date) {
// console.log(date);
// });

// Get Range Dates
console.log(dates.length);

@PaulSebalu
Copy link

Life saver. Thank you @miguelmota.

@anhtuank7c
Copy link

I would convert it to TypeScript version.

const getDates = (startDate: Date, endDate: Date) => {
  const dates = []
  let currentDate = startDate
  const addDays = (currentDate: Date, days: number) => {
    const date = new Date(currentDate)
    date.setDate(date.getDate() + days)
    return date
  }
  while (currentDate <= endDate) {
    dates.push(currentDate)
    currentDate = addDays(currentDate, 1)
  }
  return dates
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment