日期function在IE8中不起作用

我有以下在Chrome中正常工作:

function funLoad(str1,str3,str4) { var dym1 = str1.split("/"); var d=new Date(); var dym2 = d.getMonth() + 1 + " " + d.getDate() + " " + d.getFullYear() + " " + d.getHours() + ":" + d.getMinutes() + ":00"; //var dym2 = "6 10 2013 09:00:00"; var start = Date.parse(dym1[1] + " " + dym1[0] + " " + dym1[2] + " " + str3 + ":" + str4 + ":00"); var end = Date.parse(dym2); return (start-end) / (1000*60*60); } $("#btn1").click(function(event){ alert(funLoad($("#txt1").val(),$("#ddlHourTime").val(),$("#ddlMinuteTime").val())); }); 

这是一个jsFiddle: http : //jsfiddle.net/oshirowanen/QTVWd/6/

当我在IE8中运行时,我只是收到了NaN警报。

看起来IE中不支持该格式

 var dym2 = d.getMonth() + 1 + "-" + d.getDate() + "-" + d.getFullYear() + " " + d.getHours() + ":" + d.getMinutes() + ":00"; 

为了简化一点,错误是因为IE用于存储日期的格式与Chrome(以及您用于手动解析和格式化日期的那个)所使用的格式不同。 标准允许这样做,所需要的是浏览器可以解析自己生成的格式(参见§15.9.4.2 )。

通常直接使用日期格式不是一个好主意,不仅因为浏览器特定的实现而且因为全球化(对于具有虚拟全球受众的Web应用程序尤其如此)。 在实践中,我的意思是不要做这样的事情(在这篇文章中我试着解释原因):

 d.getMonth() + 1 + " " + d.getDate() + " " + d.getFullYear() 

或这个:

 d.getMonth() + 1 + "-" + d.getDate() + "-" + d.getFullYear() 

此规则几乎没有例外

  • 您正在为最终用户格式化该字符串(并且只有在您不关心她的日期格式时 ,请注意,使用该代码您将假定MDY订单和特定分隔符)。
  • 你将自己使用该字符串,你将使用另一个手工解析器解析它(你不会使用Date.parse() ),因为它的语言环境和浏览器相关。
  • 您正在编写自己的库来管理日期。

您确定每个浏览器(支持ECMAScript 5)将读取的唯一格式是ISO 8601 YYYY-MM-DDTHH:mm:ss.sssZ (参见§15.9.1.15 )所以在您的情况下,您应该更改自定义解析/格式那个。 对于较旧的浏览器,没有明确的规则(这就是我们需要库的原因)。 该标准在§15.9.4.2中说:

如果String不符合该格式[ISO 8601],则该函数可以回退到任何特定实现的启发式或特定于实现的日期格式

(重点是我的)

看看这个和这个post在SO上的其他细节(或这个关于日期的小教程 )。

我建议,如果你在浏览器和语言环境中使用日期,就是使用一个好的库来抽象所有这些细节。 我发现这个非常强大且易于使用。 如果你想要一个广泛使用的几乎完整的库,请看看moment.js 。