Date constructor returns NaN in IE, but works in Firefox and Chrome

JavascriptInternet ExplorerDate

Javascript Problem Overview


I'm trying to build a little calendar in JavaScript. I have my dates working great in Firefox and Chrome, but in IE the date functions are returning NaN.

Here is the function :

function buildWeek(dateText){
	var headerDates='';
	var newDate = new Date(dateText);
									  
	for(var d=0;d<7;d++){
		headerDates += '<th>' + newDate + '</th>';
		newDate.setDate(newDate.getDate()+1);
	}						

	jQuery('div#headerDates').html('<table><tr>'+headerDates+'</tr></table>');
}

dateText is the Monday of the current week which is actually set in php in the format of 'm, d, Y', e.g. "02, 01, 2010".

Javascript Solutions


Solution 1 - Javascript

From a mysql datetime/timestamp format:

var dateStr="2011-08-03 09:15:11"; //returned from mysql timestamp/datetime field
var a=dateStr.split(" ");
var d=a[0].split("-");
var t=a[1].split(":");
var date = new Date(d[0],(d[1]-1),d[2],t[0],t[1],t[2]);

I hope is useful for someone. Works in IE FF Chrome

Solution 2 - Javascript

The Date constructor accepts any value. If the primitive [[value]] of the argument is number, then the Date that is created has that value. If primitive [[value]] is String, then the specification only guarantees that the Date constructor and the parse method are capable of parsing the result of Date.prototype.toString and Date.prototype.toUTCString()

A reliable way to set a Date is to construct one and use the setFullYear and setTime methods.

An example of that appears here: http://jibbering.com/faq/#parseDate

ECMA-262 r3 does not define any date formats. Passing string values to the Date constructor or Date.parse has implementation-dependent outcome. It is best avoided.


Edit: The entry from comp.lang.javascript FAQ is:
An Extended ISO 8601 local date format YYYY-MM-DD can be parsed to a Date with the following:-

/**Parses string formatted as YYYY-MM-DD to a Date object.
 * If the supplied string does not match the format, an 
 * invalid Date (value NaN) is returned.
 * @param {string} dateStringInRange format YYYY-MM-DD, with year in
 * range of 0000-9999, inclusive.
 * @return {Date} Date object representing the string.
 */

  function parseISO8601(dateStringInRange) {
    var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/,
        date = new Date(NaN), month,
        parts = isoExp.exec(dateStringInRange);

    if(parts) {
      month = +parts[2];
      date.setFullYear(parts[1], month - 1, parts[3]);
      if(month != date.getMonth() + 1) {
        date.setTime(NaN);
      }
    }
    return date;
  }

Solution 3 - Javascript

Don't use "new Date()", because it takes the input date string as local time:

new Date('11/08/2010').getTime()-new Date('11/07/2010').getTime();  //90000000
new Date('11/07/2010').getTime()-new Date('11/06/2010').getTime();  //86400000

we should use "NewDate()", it takes the input as GMT time:

function NewDate(str)
         {str=str.split('-');
          var date=new Date();
          date.setUTCFullYear(str[0], str[1]-1, str[2]);
          date.setUTCHours(0, 0, 0, 0);
          return date;
         }
NewDate('2010-11-07').toGMTString();
NewDate('2010-11-08').toGMTString();

Solution 4 - Javascript

Here's another approach that adds a method to the Date object

usage: var d = (new Date()).parseISO8601("1971-12-15");

/**
* Parses the ISO 8601 formated date into a date object, ISO 8601 is YYYY-MM-DD
*
* @param {String} date the date as a string eg 1971-12-15
* @returns {Date} Date object representing the date of the supplied string
/
Date.prototype.parseISO8601 = function(date){
var matches = date.match(/^\s(\d{4})-(\d{2})-(\d{2})\s*$/);

    if(matches){
        this.setFullYear(parseInt(matches[1]));    
        this.setMonth(parseInt(matches[2]) - 1);    
        this.setDate(parseInt(matches[3]));    
    }
    
    return this;
};

Solution 5 - Javascript

Here's a code snippet that fixes that behavior of IE (v['date'] is a comma separated date-string, e.g. "2010,4,1"):

if($.browser.msie){
	$.lst = v['date'].split(',');
	$.tmp = new Date(parseInt($.lst[0]),parseInt($.lst[1])-1,parseInt($.lst[2]));
} else {
	$.tmp = new Date(v['date']);
}

The previous approach didn't consider that JS Date month is ZERO based...

Sorry for not explaining too much, I'm at work and just thought this might help.

Solution 6 - Javascript

I always store my date in UTC time.

This is my own function made from the different functions I found in this page.

It takes a STRING as a mysql DATETIME format (example : 2013-06-15 15:21:41). The checking with the regex is optional. You can delete this part to improve performance.

This function return a timestamp.

The DATETIME is considered as a UTC date. Be carefull : If you expect a local datetime, this function is not for you.

    function datetimeToTimestamp(datetime)
    {
        var regDatetime = /^[0-9]{4}-(?:[0]?[0-9]{1}|10|11|12)-(?:[012]?[0-9]{1}|30|31)(?: (?:[01]?[0-9]{1}|20|21|22|23)(?::[0-5]?[0-9]{1})?(?::[0-5]?[0-9]{1})?)?$/;
        if(regDatetime.test(datetime) === false)
            throw("Wrong format for the param. `Y-m-d H:i:s` expected.");
        
        var a=datetime.split(" ");
        var d=a[0].split("-");
        var t=a[1].split(":");
        
        var date = new Date();
        date.setUTCFullYear(d[0],(d[1]-1),d[2]);
        date.setUTCHours(t[0],t[1],t[2], 0);
        
        return date.getTime();
    }

Solution 7 - Javascript

Send the date text and format in which you are sending the datetext in the below method. It will parse and return as date and this is independent of browser.

function cal_parse_internal(val, format) {
val = val + "";
format = format + "";
var i_val = 0;
var i_format = 0;
var x, y;
var now = new Date(dbSysCurrentDate);
var year = now.getYear();
var month = now.getMonth() + 1;
var date = now.getDate();

while (i_format < format.length) {
	// Get next token from format string
	var c = format.charAt(i_format);
	var token = "";
	while ((format.charAt(i_format) == c) && (i_format < format.length)) {
		token += format.charAt(i_format++);
	}
	// Extract contents of value based on format token
	if (token == "yyyy" || token == "yy" || token == "y") {
		if (token == "yyyy") { x = 4; y = 4; }
		if (token == "yy")   { x = 2; y = 2; }
		if (token == "y")    { x = 2; y = 4; }
		year = _getInt(val, i_val, x, y);
		if (year == null) { return 0; }
		i_val += year.length;
		if (year.length == 2) {
			if (year > 70) {
                year = 1900 + (year - 0);
            } else {
                year = 2000 + (year - 0);
            }
		}
	} else if (token == "MMMM") {
		month = 0;
		for (var i = 0; i < MONTHS_LONG.length; i++) {
			var month_name = MONTHS_LONG[i];
			if (val.substring(i_val, i_val + month_name.length) == month_name) {
				month = i + 1;
				i_val += month_name.length;
				break;
			}
		}
		if (month < 1 || month > 12) { return 0; }
	} else if (token == "MMM") {
		month = 0;
		for (var i = 0; i < MONTHS_SHORT.length; i++) {
			var month_name = MONTHS_SHORT[i];
			if (val.substring(i_val, i_val + month_name.length) == month_name) {
				month = i + 1;
				i_val += month_name.length;
				break;
			}
		}
		if (month < 1 || month > 12) { return 0; }
	} else if (token == "MM" || token == "M") {		
		month = _getInt(val, i_val, token.length, 2);
		if (month == null || month < 1 || month > 12) { return 0; }
		i_val += month.length;
    } else if (token == "dd" || token == "d") {
		date = _getInt(val, i_val, token.length, 2);
		if (date == null || date < 1 || date > 31) { return 0; }
		i_val += date.length;
    } else {
		if (val.substring(i_val, i_val+token.length) != token) {return 0;}
		else {i_val += token.length;}
	}
}

// If there are any trailing characters left in the value, it doesn't match
if (i_val != val.length) { return 0; }

// Is date valid for month?
if (month == 2) {
	// Check for leap year
	if ((year%4 == 0 && year%100 != 0) || (year%400 == 0)) { // leap year
		if (date > 29) { return false; }
	} else {
        if (date > 28) { return false; }
    }
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
	if (date > 30) { return false; }
}
return new Date(year, month - 1, date);
}

Solution 8 - Javascript

Here's my approach:

var parseDate = function(dateArg) {
    var dateValues = dateArg.split('-');
    var date = new Date(dateValues[0],dateValues[1],dateValues[2]);
    return date.format("m/d/Y");
}

replace ('-') with the delimeter you're using.

Solution 9 - Javascript

The Date constructor in JavaScript needs a string in one of the date formats supported by the parse() method.

Apparently, the format you are specifying isn't supported in IE, so you'll need to either change the PHP code, or parse the string manually in JavaScript.

Solution 10 - Javascript

You can use the following code to parse ISO8601 date string:

function parseISO8601(d) {
    var timestamp = d;
    if (typeof (d) !== 'number') {
        timestamp = Date.parse(d);
    }
    return new Date(timestamp);
};

Solution 11 - Javascript

Try out using getDate feature of datepicker.

$.datepicker.formatDate('yy-mm-dd',new Date(pField.datepicker("getDate")));

Solution 12 - Javascript

I tried all the above solution but nothing worked for me. I did some brainstorming and found this and worked fine in IE11 as well.

value="2020-08-10 05:22:44.0";
var date=new Date(value.replace(" ","T")).$format("d/m/yy h:i:s");
console.log(date);

if $format is not working for you use format only.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpedalpeteView Question on Stackoverflow
Solution 1 - JavascriptQlimaxView Answer on Stackoverflow
Solution 2 - JavascriptGarrettView Answer on Stackoverflow
Solution 3 - JavascriptdiyismView Answer on Stackoverflow
Solution 4 - JavascriptmagikMakerView Answer on Stackoverflow
Solution 5 - JavascriptMartin ZeitlerView Answer on Stackoverflow
Solution 6 - JavascriptGabrielView Answer on Stackoverflow
Solution 7 - JavascriptvalliView Answer on Stackoverflow
Solution 8 - JavascriptxinView Answer on Stackoverflow
Solution 9 - JavascriptrichardtallentView Answer on Stackoverflow
Solution 10 - JavascriptisaranchukView Answer on Stackoverflow
Solution 11 - JavascriptDevika AnupView Answer on Stackoverflow
Solution 12 - JavascriptPRAFUL KUMARView Answer on Stackoverflow