2010-02-02 90 views
70

我正在尝试在JavaScript中构建一个小日历。我的日期在Firefox和Chrome中运行良好,但在IE中日期函数返回NaN。日期构造函数在IE中返回NaN,但在Firefox和Chrome中可用

下面是函数:

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是被在“米,d,Y”的格式在PHP实际设定的当前周的星期一,例如"02, 01, 2010"

+2

您对您的代码示例一些复制粘贴错误,看看for语句:'为(VAR d = 0; d';',这将提高一个'SyntaxError' ... – CMS 2010-02-02 06:36:59

回答

62

Date构造函数接受任何值。如果参数的原始[[value]]是数字,那么创建的Date就有该值。如果primitive [[value]]是String,那么规范只保证Date构造函数和解析方法能够解析Date.prototype.toString和Date.prototype.toUTCString()的结果。一种可靠的方法设置日期是构建一个并使用setFullYearsetTime方法。

这方面的一个例子出现在这里: http://jibbering.com/faq/#parseDate

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


编辑: 从comp.lang.javascript FAQ的条目是: 一个扩展的ISO 8601的本地日期格式 YYYY-MM-DD可以被解析到一个 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; 
    } 
+0

谢谢Garrett。你在链接中提供的这个功能比我能找到的任何其他功能都要简洁得多,而且它适用于我通过其他99%应用程序使用的日期格式。我正在使用 – pedalpete 2010-02-02 18:32:49

+0

这是唉,不好,因为许多结构化的格式只是使用W3C日期/时间格式(ISO-8601,全规格左右)。所以虽然时间戳在很多方面都更好(更简单,更高效,适用于所有浏览器),但通常需要标准日期/时间数据是来自javascript的解析器。 我不知道,如果jQuery或这样会有更好的解析方法。 – StaxMan 2010-05-27 20:05:23

+3

感谢指出,疯了为什么铬工作正常解析日期,而IE7说NAN,好东西$ jQuery的$ .datepicker.parseDate能够解析日期 – 2012-10-30 08:37:36

0

JavaScript中的Date构造函数需要一个parse()方法支持的日期格式之一的字符串。

显然,您指定的格式在IE中不受支持,因此您需要更改PHP代码或手动解析JavaScript中的字符串。

+4

这一点是很明显,但是知道支持哪些格式可能是很好的... – StaxMan 2010-05-27 20:06:55

1

在下面的方法中发送您要发送datetext的日期文本和格式。它会解析并返回日期,这与浏览器无关。

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

感谢Valli。我在下面的Garrett的答案中提到过,因为他链接的功能更小,并且使用我经常使用的日期格式 – pedalpete 2010-02-02 18:33:39

15

别T选用 “新的Date()”,因为它需要输入的日期字符串为本地时间:

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() ”,它需要输入为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(); 
1

这里是我的方法:

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

与您所使用的分隔符替换('-')

2

下面是修复IE (v ['date']是逗号分隔日期字符串的行为的代码片段,例如,“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']); 
} 

以前的做法没有考虑到JS日期月份从零开始......

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

81

从MySQL日期时间/时间戳格式:

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铬

+1

不错的一个!感谢分享+1 – 2012-02-06 21:35:38

+2

谢谢,正是我所需要的。 – Pascal 2012-11-19 15:00:40

+1

适用于Internet Explorer 8 – max4ever 2013-06-18 14:23:08

7

这里的另一种方法,增加了一个方法将Date对象

用法: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; 
    }; 
+0

http://stackoverflow.com/review/suggested-edits/3261141 – Stano 2013-10-31 22:52:27

2

我一直保存在我的UTC时间日期。

这是我自己的功能,由我在此页面中找到的不同功能组成。

它需要一个字符串作为mysql日期时间格式(例如:2013-06-15 15:21:41)。使用正则表达式的检查是可选的。您可以删除此部分以提高性能。

该函数返回一个时间戳。

DATETIME被视为UTC日期。小心:如果你期待本地日期时间,这个函数不适合你。

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

您可以使用下面的代码来解析ISO8601日期字符串:

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

试试使用datepickergetDate功能。

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

请详细说明你想要解释的答案。 – 2016-07-18 06:17:12

相关问题