Javascript Date() constructor doesn't work
I have an issue -
The javascript Date("mm-dd-yyyy")
constructor doesn't work for FF. It works fine for IE.
- IE :
new Date("04-02-2008")
=>"Wed Apr 2 00:00:00 EDT 2008"
- FF2 :
new Date("04-02-2008")
=>Invalid Date
So lets try another constructor. Trying this constructor Date("yyyy", "mm", "dd")
- IE :
new Date("2008", "04", "02");
=>"Fri May 2 00:00:00 EDT 2008"
- FF :
new Date("2008", "04", "02");
=>"Fri May 2 00:00:00 EDT 2008"
- IE :
new Date("2008", "03", "02");
=>"Wed Apr 2 00:00:00 EDT 2008"
- FF :
new Date("2008", "03", "02");
=>"Wed Apr 2 00:00:00 EDT 2008"
So the Date("yyyy", "mm", "dd")
constructor uses an index of 0
to represent January.
Has anyone dealt with this?
There must be a better way than subtracting 1 from the months.
Solution 1:
It is the definition of the Date object to use values 0-11 for the month
field.
I believe that the constructor using a String is system-dependent (not to mention locale/timezone dependent) so you are probably better off using the constructor where you specify year/month/day as seperate parameters.
BTW, in Firefox,
new Date("04/02/2008");
works fine for me - it will interpret slashes, but not hyphens. I think this proves my point that using a String to construct a Date object is problemsome. Use explicit values for month/day/year instead:
new Date(2008, 3, 2);
Solution 2:
nice trick indeed, which i just found out the hard way (by thinking thru it). But i used a more natural date string with hyphen :-)
var myDateArray = "2008-03-02".split("-");
var theDate = new Date(myDateArray[0],myDateArray[1]-1,myDateArray[2]);
alert(theDate);
Solution 3:
Using
var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]);
Is fine, but it shows some strange behaviors when month and day values are erroneous.
Try casting a date where both myDate[1]-1
and myDate[2]
have values of 55. Javascript still returns a date, though the input is obviously not correct.
I would have preferred javascript to return an error in such a case.
Solution 4:
@Frank: you are right. When you need to validate date,
var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]);
will not work.
What happens is that it keeps on adding the extra parameter. For example:
new Date("2012", "11", "57") // Date {Sat Jan 26 2013 00:00:00 GMT+0530 (IST)}
Date object takes the extra days (57-31=26) and adds it to the date we created.
Or if we try constructing a date object with:
new Date("2012", "11", "57", "57") //Date {Mon Jan 28 2013 09:00:00 GMT+0530 (IST)}
an extra 2 days and 9 hours (57=24+24+9) are added.
Solution 5:
You're quite right, month is indicated as an index, so January is month number 0 and December is month number 11 ...
-- and there is no work-around as it is stated clearly in the ECMA-script-definition, though simple tricks commonly will work:
var myDate = "2008,03,02".split(",");
var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]);
alert(theDate);