2

我有以下在 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.

4

2 回答 2

1

看起来 IE 不支持该格式

var dym2 = d.getMonth() + 1 + "-" + d.getDate() + "-" + d.getFullYear() + " " + d.getHours() + ":" + d.getMinutes() + ":00";
于 2013-06-12T11:44:55.027 回答
1

为了简化一点,错误是因为 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中说:

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

(重点是我的)

看看这个这个关于 SO 的帖子了解其他细节(或这个关于日期的小教程)。

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

于 2013-06-12T11:47:45.420 回答