Cody Carmichael
Cody Carmichael

Reputation: 187

Add Days to Date in Loop Javascript

I need to add days to a date in Javascript inside of a loop.

Currently, I have this -

var occurences = 2;
var start_date = "10/2/2020";
for(i=0; i < occurences; i++){
  var repeat_every = 2; //repeat every number of days/weeks/months
  var last = new Date(start_date);
  var day =last.getDate() + repeat_every;
  var month=last.getMonth()+1;
  var year=last.getFullYear();
  var fulldate = month + '/' + day + '/' + year;
  console.log(fulldate);
}

However, this outputs 10/4/2020 twice. I know the issue is because in the 2nd iteration of the loop it again simply adds 2 to the date 10/2/2020, is there a way on the subsequent iterations I can add 2 to the previous result?

Thank you!

Upvotes: 0

Views: 1478

Answers (3)

Scott Sauyet
Scott Sauyet

Reputation: 50807

I would separate the generation of the days from their formatting / logging. Here we have a function that collects count instances of incrementally adding n days to a date, returning a collection of Date objects:

const everyNDays = (n, count, start = new Date()) => {
  const y = start.getFullYear(), m = start.getMonth(), d = start.getDate()
  return Array.from({length: count}, (_, i) => new Date(y, m, d + (i + 1) * n))
}

const formatDate = (date) =>
  date .toLocaleDateString ()

console .log (
  everyNDays (2, 20) .map (formatDate)
)
// or everyNDays (2, 20) .forEach (date => console .log (formatDate (date)))
.as-console-wrapper {max-height: 100% !important; top: 0}

(If you don't pass a start date, it uses the current date.)

We then map the simple formatDate function over these dates to get an array of strings.

If you would rather start with the current date, you can simply replace new Date(y, m, d + (i + 1) * n) with new Date(y, m, d + i * n).

Upvotes: 0

MT0
MT0

Reputation: 168796

You can use a multiple of your interval and then use last.setDate( last.getDate() + repeat_every ) to add days and get the correct month and year:

var occurences = 20;
var start_date = "10/2/2020";
for(i=1; i <= occurences; i++){
  var repeat_every = 2*i; //repeat every number of days/weeks/months
  var last = new Date(start_date);
  last.setDate( last.getDate() + repeat_every );
  console.log( `${last.getDate()}/${last.getMonth()+1}/${last.getFullYear()}` );
}

Upvotes: 1

TheMaster
TheMaster

Reputation: 50890

Make counter i a multiple of repeat_every:

/*<ignore>*/console.config({maximize:true,timeStamps:false,autoScroll:false});/*</ignore>*/
var occurences = 2;
var start_date = "10/2/2020";
for(i=1; i <= occurences; i++){
  var repeat_every = 2*i; //repeat every number of days/weeks/months
  var last = new Date(start_date);
  var day =last.getDate() + repeat_every;
  var month=last.getMonth()+1;
  var year=last.getFullYear();
  var fulldate = month + '/' + day + '/' + year;
  console.log(fulldate);
}
<!-- https://meta.stackoverflow.com/a/375985/ -->    <script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

Upvotes: 0

Related Questions