study hall Q - need to add x days to date in javascript

  • 1
  • Question
  • Updated 4 years ago
The question is simple, but I suspect the answer is not quite so.

I know how to use the getDate() and setDate() functions, but they give me the day of the month. Doesn't work when I want to add 6 days to January 31, 2015. Oddly enough the answer I get back that is March 9, 2015. Watch the video to see what I mean.

I basically want to do what I thought would be easy in javascript. Like this example from datajs.



Photo of mB Pat Vachon

mB Pat Vachon, Champion

  • 42,704 Points 20k badge 2x thumb

Posted 4 years ago

  • 1
Photo of Irvin Waldman

Irvin Waldman, Champion

  • 9,006 Points 5k badge 2x thumb
Take a look here:  http://www.javascriptcookbook.com/article/Perform-date-manipulations-based-on-adding-or-subtracting-...

To add 3 days you would do something like this:

var date = new Date(); <br>date.setDate(date.getDate() + 3);
Photo of mB Pat Vachon

mB Pat Vachon, Champion

  • 42,704 Points 20k badge 2x thumb
That doesn't work as it sets the day of the month. So if it were Feb. 28 today but then I set the startDate field to Jan. 1, endDate would end being Feb. 4.

I should've included my code.

var params = arguments[0],
	$ = skuid.$,
	JRModel = skuid.$M('REP_JobReport'),
	JRModelRow = JRModel.getFirstRow(),
	startDay = new Date(),
	endDay = new Date();
	
	//The start date is set on the skuid page and this snippet is run when the report type, RECON__Dayof__c or RECON__WeekOf__c is updated
	
	if (JRModel.getFieldValue(JRModelRow,'RECON__Report_Type__c')=='Daily') {
	    
	    startDay = skuid.time.parseSFDate(JRModel.getFieldValue(JRModelRow,'RECON__Dayof__c'));
	    endDay = startDay;
	    
	} else {
	    startDay = skuid.time.parseSFDate(JRModel.getFieldValue(JRModelRow,'RECON__WeekOf__c'));
	    endDay.setDate(startDay.getDate() + 6);
	}
	
	var fields = {
        RECON__Display_Start_Date__c: skuid.time.getSFDate(startDay),
        RECON__Display_End_Date__c: skuid.time.getSFDate(endDay)
    };
	
	JRModel.updateRow(JRModelRow,fields);
(Edited)
Photo of Ben Hubbard

Ben Hubbard, Employee

  • 12,470 Points 10k badge 2x thumb
Hi Pat,

Lets step through the important parts of your code...

startDay = new Date();   // startDay is now today's date say 2015-02-20
endDay = new Date();    // endDay is now today's date say 2015-02-20


startDay = skuid.time.parseDate(...);   // startDay is now the day you picked 2015-01-31
endDay.setDate(startDay.getDate() + 6);  // endDay is now Today's year, and today's month, but with 37 days.  So 2015-02-37. Javascript interprets that as march 9th!

Javascript dates are pretty confusing and this stuff has gotten me so many times.  To fix this, clone the end date first.

startDay = skuid.time.parseDate(...);
endDay = new Date(startDay.getTime());   // This makes endDay a clone of startDay
endDay.setDate(startDay.getDate() + 6);
Photo of mB Pat Vachon

mB Pat Vachon, Champion

  • 42,704 Points 20k badge 2x thumb
I get it now .... I think. I first have to update the endDay to be equal to the current startDay date before trying to add days to it. The one thing I haven't tried, or new about, was "cloning" the startDate Date.

So, adding days to a date object works just fine. ie. adding 6 days to Jan. 31 gets Feb. 6.
Photo of Ben Hubbard

Ben Hubbard, Employee

  • 12,470 Points 10k badge 2x thumb
Yup, you got it.  To make your code less confusing, I'd probably make that last line use endDay only.  Like this...

endDay.setDate(endDay.getDate() + 6);

That way it's pretty obvious that you're just adding 6 days to endDay.
Photo of mB Pat Vachon

mB Pat Vachon, Champion

  • 42,704 Points 20k badge 2x thumb
Done and done. Thank you!