Login Register

Problem with dojo.date.add

I have a widget I created way back in 0.4 that I'm porting over to 1.0
It is using dojo.date.add a lot and today I found a problem.
Back in Dojo 0.4 a call like this dojo.date.add(date, dojo.date.dateParts.DAY, 1); resulted in the following code:

date.setDate(date.getDate() + 1);

In Dojo 1.0.x the call dojo.date.add(date, "day", 1); results in the following code:

date.setUTCDate(date.getUTCDate() + 1);

The problem with using the UTC date is that when daylight savings go in/out of effect the we don't add a "Day" we add 25/23 hours.

To highlight the problem even more I supply the following code snippet.

<script>
dojo.require("dojo.date.locale");

function createCalendarDates(date){
        var curDojoDate = new Date(date);
        var curJSDate = new Date(date);
        var numberOfDays = dojo.date.getDaysInMonth(date);
        var sDojoString = sJSString = '';
        for(var i=0; i<numberOfDays; i++) {
                sDojoString += curDojoDate + '';
                sJSString += curJSDate + '';
               
                curDojoDate = dojo.date.add(curDojoDate, "day", 1);
                curJSDate.setDate(curJSDate.getDate() + 1);
        }
        dojo.byId("byDojoDateAdd").innerHTML = sDojoString;
        dojo.byId("byJSDateAdd").innerHTML = sJSString;
}

dojo.addOnLoad(function(){
        var nov1 = new Date(2007,10,1);
        createCalendarDates(nov1);
});
</script>


<span id="byDojoDateAdd" style="float:left; width:450px;"></span>
<span id="byJSDateAdd" style="float:left;"></span>

The resulting HTML page will look something like this:

Thu Nov 01 2007 00:00:00 GMT-0500 (Central Daylight Time)  Thu Nov 01 2007 00:00:00 GMT-0500 (Central Daylight Time)
Fri Nov 02 2007 00:00:00 GMT-0500 (Central Daylight Time)  Fri Nov 02 2007 00:00:00 GMT-0500 (Central Daylight Time)
Sat Nov 03 2007 00:00:00 GMT-0500 (Central Daylight Time)  Sat Nov 03 2007 00:00:00 GMT-0500 (Central Daylight Time)
Sun Nov 04 2007 00:00:00 GMT-0500 (Central Daylight Time)  Sun Nov 04 2007 00:00:00 GMT-0500 (Central Daylight Time)
Sun Nov 04 2007 23:00:00 GMT-0600 (Central Standard Time)  Mon Nov 05 2007 00:00:00 GMT-0600 (Central Standard Time)
Mon Nov 05 2007 23:00:00 GMT-0600 (Central Standard Time)  Tue Nov 06 2007 00:00:00 GMT-0600 (Central Standard Time)
...
Wed Nov 28 2007 23:00:00 GMT-0600 (Central Standard Time)  Thu Nov 29 2007 00:00:00 GMT-0600 (Central Standard Time)
Thu Nov 29 2007 23:00:00 GMT-0600 (Central Standard Time)  Fri Nov 30 2007 00:00:00 GMT-0600 (Central Standard Time)

Is this something I'm the only one having problems with or can we see a fix???
The fix that I would like, would be to change line 191 of dojocore/dojo/date.js from:

sum["setUTC"+property](sum["getUTC"+property]()+amount);

to:

sum["set"+property](sum["get"+property]()+amount);

Sincerely,
Viktor

Thanks for reporting this.

Thanks for reporting this. I filed a ticket and fixed the problem. Instead of using:

case "hour":
                case "minute":
                case "second":
                case "millisecond":
                        property = interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
        }

        if(property){
                sum["setUTC"+property](sum["getUTC"+property]()+amount);
        }

I changed it to look like this:

case "hour":
                case "minute":
                case "second":
                case "millisecond":
                        property = "UTC"+interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
        }

        if(property){
                sum["set"+property](sum["get"+property]()+amount);
        }

This will use locale for any interval greater than an hour while still correctly adding any interval less than or equal to an hour. Here is some code to test both situations:

dojo.require("dojo.date.locale");

function appendRow(table_name, djDate, jsDate){
	var tr = document.createElement("tr");
	var dd = document.createElement("td");
	var jd = document.createElement("td");

	dd.innerHTML = djDate;
	jd.innerHTML = jsDate;

	tr.appendChild(dd);
	tr.appendChild(jd);
	dojo.byId(table_name).appendChild(tr);
}

function createCalendarDates(date){
	var curDojoDate = new Date(date);
	var curJSDate = new Date(date);
	var numberOfDays = dojo.date.getDaysInMonth(date);
	for(var i=0; i

Days

DojoJavaScript

Hours

DojoJavaScript

And the result:

Days
Dojo	                                JavaScript
Thu Nov 01 2007 00:00:00 GMT-0500 (CDT)	Thu Nov 01 2007 00:00:00 GMT-0500 (CDT)
Fri Nov 02 2007 00:00:00 GMT-0500 (CDT)	Fri Nov 02 2007 00:00:00 GMT-0500 (CDT)
Sat Nov 03 2007 00:00:00 GMT-0500 (CDT)	Sat Nov 03 2007 00:00:00 GMT-0500 (CDT)
Sun Nov 04 2007 00:00:00 GMT-0500 (CDT)	Sun Nov 04 2007 00:00:00 GMT-0500 (CDT)
Mon Nov 05 2007 00:00:00 GMT-0600 (CST)	Mon Nov 05 2007 00:00:00 GMT-0600 (CST)
Tue Nov 06 2007 00:00:00 GMT-0600 (CST)	Tue Nov 06 2007 00:00:00 GMT-0600 (CST)
Wed Nov 07 2007 00:00:00 GMT-0600 (CST)	Wed Nov 07 2007 00:00:00 GMT-0600 (CST)
Thu Nov 08 2007 00:00:00 GMT-0600 (CST)	Thu Nov 08 2007 00:00:00 GMT-0600 (CST)
Fri Nov 09 2007 00:00:00 GMT-0600 (CST)	Fri Nov 09 2007 00:00:00 GMT-0600 (CST)
Sat Nov 10 2007 00:00:00 GMT-0600 (CST)	Sat Nov 10 2007 00:00:00 GMT-0600 (CST)
Sun Nov 11 2007 00:00:00 GMT-0600 (CST)	Sun Nov 11 2007 00:00:00 GMT-0600 (CST)
Mon Nov 12 2007 00:00:00 GMT-0600 (CST)	Mon Nov 12 2007 00:00:00 GMT-0600 (CST)
Tue Nov 13 2007 00:00:00 GMT-0600 (CST)	Tue Nov 13 2007 00:00:00 GMT-0600 (CST)
Wed Nov 14 2007 00:00:00 GMT-0600 (CST)	Wed Nov 14 2007 00:00:00 GMT-0600 (CST)
Thu Nov 15 2007 00:00:00 GMT-0600 (CST)	Thu Nov 15 2007 00:00:00 GMT-0600 (CST)
Fri Nov 16 2007 00:00:00 GMT-0600 (CST)	Fri Nov 16 2007 00:00:00 GMT-0600 (CST)
Sat Nov 17 2007 00:00:00 GMT-0600 (CST)	Sat Nov 17 2007 00:00:00 GMT-0600 (CST)
Sun Nov 18 2007 00:00:00 GMT-0600 (CST)	Sun Nov 18 2007 00:00:00 GMT-0600 (CST)
Mon Nov 19 2007 00:00:00 GMT-0600 (CST)	Mon Nov 19 2007 00:00:00 GMT-0600 (CST)
Tue Nov 20 2007 00:00:00 GMT-0600 (CST)	Tue Nov 20 2007 00:00:00 GMT-0600 (CST)
Wed Nov 21 2007 00:00:00 GMT-0600 (CST)	Wed Nov 21 2007 00:00:00 GMT-0600 (CST)
Thu Nov 22 2007 00:00:00 GMT-0600 (CST)	Thu Nov 22 2007 00:00:00 GMT-0600 (CST)
Fri Nov 23 2007 00:00:00 GMT-0600 (CST)	Fri Nov 23 2007 00:00:00 GMT-0600 (CST)
Sat Nov 24 2007 00:00:00 GMT-0600 (CST)	Sat Nov 24 2007 00:00:00 GMT-0600 (CST)
Sun Nov 25 2007 00:00:00 GMT-0600 (CST)	Sun Nov 25 2007 00:00:00 GMT-0600 (CST)
Mon Nov 26 2007 00:00:00 GMT-0600 (CST)	Mon Nov 26 2007 00:00:00 GMT-0600 (CST)
Tue Nov 27 2007 00:00:00 GMT-0600 (CST)	Tue Nov 27 2007 00:00:00 GMT-0600 (CST)
Wed Nov 28 2007 00:00:00 GMT-0600 (CST)	Wed Nov 28 2007 00:00:00 GMT-0600 (CST)
Thu Nov 29 2007 00:00:00 GMT-0600 (CST)	Thu Nov 29 2007 00:00:00 GMT-0600 (CST)
Fri Nov 30 2007 00:00:00 GMT-0600 (CST)	Fri Nov 30 2007 00:00:00 GMT-0600 (CST)

Hours
Dojo	                                JavaScript
Sun Nov 04 2007 00:00:00 GMT-0500 (CDT)	Sun Nov 04 2007 00:00:00 GMT-0500 (CDT)
Sun Nov 04 2007 01:00:00 GMT-0500 (CDT)	Sun Nov 04 2007 01:00:00 GMT-0500 (CDT)
Sun Nov 04 2007 01:00:00 GMT-0600 (CST)	Sun Nov 04 2007 01:00:00 GMT-0600 (CST)
Sun Nov 04 2007 02:00:00 GMT-0600 (CST)	Sun Nov 04 2007 02:00:00 GMT-0600 (CST)
Sun Nov 04 2007 03:00:00 GMT-0600 (CST)	Sun Nov 04 2007 03:00:00 GMT-0600 (CST)
Sun Nov 04 2007 04:00:00 GMT-0600 (CST)	Sun Nov 04 2007 04:00:00 GMT-0600 (CST)
Sun Nov 04 2007 05:00:00 GMT-0600 (CST)	Sun Nov 04 2007 05:00:00 GMT-0600 (CST)
Sun Nov 04 2007 06:00:00 GMT-0600 (CST)	Sun Nov 04 2007 06:00:00 GMT-0600 (CST)
Sun Nov 04 2007 07:00:00 GMT-0600 (CST)	Sun Nov 04 2007 07:00:00 GMT-0600 (CST)
Sun Nov 04 2007 08:00:00 GMT-0600 (CST)	Sun Nov 04 2007 08:00:00 GMT-0600 (CST)
Sun Nov 04 2007 09:00:00 GMT-0600 (CST)	Sun Nov 04 2007 09:00:00 GMT-0600 (CST)
Sun Nov 04 2007 10:00:00 GMT-0600 (CST)	Sun Nov 04 2007 10:00:00 GMT-0600 (CST)
Sun Nov 04 2007 11:00:00 GMT-0600 (CST)	Sun Nov 04 2007 11:00:00 GMT-0600 (CST)
Sun Nov 04 2007 12:00:00 GMT-0600 (CST)	Sun Nov 04 2007 12:00:00 GMT-0600 (CST)
Sun Nov 04 2007 13:00:00 GMT-0600 (CST)	Sun Nov 04 2007 13:00:00 GMT-0600 (CST)
Sun Nov 04 2007 14:00:00 GMT-0600 (CST)	Sun Nov 04 2007 14:00:00 GMT-0600 (CST)
Sun Nov 04 2007 15:00:00 GMT-0600 (CST)	Sun Nov 04 2007 15:00:00 GMT-0600 (CST)
Sun Nov 04 2007 16:00:00 GMT-0600 (CST)	Sun Nov 04 2007 16:00:00 GMT-0600 (CST)
Sun Nov 04 2007 17:00:00 GMT-0600 (CST)	Sun Nov 04 2007 17:00:00 GMT-0600 (CST)
Sun Nov 04 2007 18:00:00 GMT-0600 (CST)	Sun Nov 04 2007 18:00:00 GMT-0600 (CST)
Sun Nov 04 2007 19:00:00 GMT-0600 (CST)	Sun Nov 04 2007 19:00:00 GMT-0600 (CST)
Sun Nov 04 2007 20:00:00 GMT-0600 (CST)	Sun Nov 04 2007 20:00:00 GMT-0600 (CST)
Sun Nov 04 2007 21:00:00 GMT-0600 (CST)	Sun Nov 04 2007 21:00:00 GMT-0600 (CST)
Sun Nov 04 2007 22:00:00 GMT-0600 (CST)	Sun Nov 04 2007 22:00:00 GMT-0600 (CST)
Sun Nov 04 2007 23:00:00 GMT-0600 (CST)	Sun Nov 04 2007 23:00:00 GMT-0600 (CST)

As you can see, both situations now work. Thanks again for reporting it!

Thank you for your reply

I'm just glad I could help.