date构造函数在IE中返回NaN,但在Firefox和Chrome中工作

我正在尝试在JavaScript中构build一个小日历。 我有我的date在Firefox和Chrome中很好的工作,但在IE中date函数返回NaN。

这是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是当前周的周一,实际上在php中以“m,d,Y”的格式设置,例如"02, 01, 2010" dateText "02, 01, 2010"

Date构造函数接受任何值。 如果参数的原始[[value]]是数字,那么创build的Date就是该值。 如果primitive [[value]]是String,那么规范只保证Date构造函数和parse方法能够parsingDate.prototype.toString和Date.prototype.toUTCString()的结果。

设置date的可靠方法是构build一个date,并使用setFullYearsetTime方法。

下面是一个例子: http : //jibbering.com/faq/#parseDate

ECMA-262 r3没有定义任何date格式。 将string值传递给Date构造函数或Date.parse具有实现相关的结果。 这是最好的避免。


编辑:从comp.lang.javascript常见问题的条目是:扩展的ISO 8601本地date格式YYYY-MM-DD可以被parsing为一个Date与以下内容: –

 /**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; } 

从一个MySQLdate时间/时间戳格式:

 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]); 

我希望对某人有用。 适用于IE FF Chrome

不要使用“new Date()”,因为它将inputdatestring当作本地时间:

 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 

我们应该使用“NewDate()”,它将input格式为GMT时间:

 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(); 

这是另一种将方法添加到Date对象的方法

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

     / **
      *将ISO 8601格式的date分析为date对象,ISO 8601为YYYY-MM-DD
      * 
      * @param {String}将date作为一个string,例如1971-12-15
      * @returns {Date}表示提供的string的date的Date对象
      * /
     Date.prototype.parseISO8601 = function(date){
         var matches = date.match(/ ^ \ s *(\ d {4}) - (\ d {2}) - (\ d {2})\ s * $ /);

        如果(匹配){
             this.setFullYear(parseInt函数(匹配[1]));    
             this.setMonth(parseInt(matches [2]) -  1);    
             this.setDate(parseInt函数(比赛[3]));    
         }

        返回这个;
     };

我总是以UTC时间存储我的date。

这是我自己的function,从我在这个页面中find不同的function。

它需要一个string作为MySQL DATETIME格式(例如:2013-06-15 15:21:41)。 正则expression式的检查是可选的。 您可以删除此部分以提高性能。

这个函数返回一个时间戳。

DATETIME被认为是UTCdate 。 小心:如果你期望有一个本地date时间,这个函数不适合你。

  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. `Ymd 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(); } 

这是一个代码片段,修复了IE的行为(v ['date']是逗号分隔的datestring,例如“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']); } 

以前的做法不认为JSdate月是基于零…

对不起,没有太多解释,我在工作,只是认为这可能会有所帮助。

这是我的方法:

 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('-')

在下面的方法中发送你发送datetext的date文本和格式。 它将parsing和返回作为date,这是独立于浏览器。

 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); } 

JavaScript中的Date构造函数需要一个parse()方法所支持的date格式之一的string。

显然,你指定的格式在IE中是不支持的,所以你需要改变PHP代码,或者用JavaScript手动parsingstring。

您可以使用下面的代码来parsingISO8601datestring:

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

尝试使用getDatefunction。

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