日期功能在IE8中不起作用

时间:2013-06-12 11:39:41

标签: javascript jquery internet-explorer-8

我已经得到以下可以在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的警告。

2 个答案:

答案 0 :(得分:1)

看起来IE中不支持该格式

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

答案 1 :(得分:1)

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

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

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中表示:

  

如果字符串不符合该格式[ISO 8601],则该功能可能会回退到任何特定于实现的启发式或特定于实现的日期格式

(重点是我的)

查看SO上的thisthis个帖子了解其他详情(或this little tutorial关于日期)。

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