Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 日期函数在IE8中不起作用_Javascript_Jquery_Internet Explorer 8 - Fatal编程技术网

Javascript 日期函数在IE8中不起作用

Javascript 日期函数在IE8中不起作用,javascript,jquery,internet-explorer-8,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

我有以下在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()));
});
下面是一个JSFIDLE:


当我在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()
这条规则很少有例外:

  • 您正在为最终用户格式化该字符串(并且只有如果您不关心她的日期格式,请注意,使用该代码时,您假定MDY顺序和特定分隔符)
  • 您将自己使用该字符串,并使用另一个手工解析器对其进行解析(您不会使用
    Date.parse()
    ),因为它依赖于语言环境和浏览器
  • 您正在编写自己的库来管理日期
您确信每个浏览器(支持ECMAScript 5)将读取的唯一格式是ISO 8601
YYYY-MM-DDTHH:MM:ss.sssZ
(请参见§15.9.1.15),因此在您的情况下,您应该将自定义解析/格式更改为该格式。对于较旧的浏览器,没有明确的规则(这就是为什么我们需要一个库)。标准第15.9.4.2节规定:

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

(重点是我的)

查看和发布其他详细信息(或关于日期)


我的建议是,如果您处理跨浏览器和区域设置的日期,使用一个好的库来抽象所有这些细节。我发现它很结实,而且很容易使用。如果您想要一个广泛使用的几乎完整的库,也可以查看。

可能需要查看修复(即警报)Hmmmmm是和否,该格式非常不标准。在我看来,FF和Safari都无法理解它(而且它依赖于语言环境)。“您确定每个浏览器都会读取的唯一格式是YYYY-MM-DDTHH:MM:ss.sssZ”这是不正确的:它是ISO 8601格式的一个版本,并且只受支持ECMAScript 5的浏览器支持。所有浏览器支持的唯一标准是@对不起,你错了。适用于FireFox的内容不是标准的。唯一的要求(来自标准)是浏览器可以解析它产生的日期(通常它取决于语言环境,所以“2000年2月1日”对您来说可能是“2/1/2000”,对我来说可能是“1/2/2000”)。你所说的适用于FF,但IE、Opera、Safari和Chrome呢?在ES5中,他们引入了标准格式(ISO 8601),这是唯一可以信任的格式。如果您指定的日期始终为dd/mm/yyyy格式(根据您提供的链接),它将失败,例如,在日本机器上使用Chrome…库(如moment.js)来抽象这种差异。如果有一个通用的标准,它们必须更加简单,并且没有那么多依赖于浏览器的技巧。RFC 2822在所有支持ECMAScript 3的浏览器中实现,包括像IE 7这样的旧浏览器。此外,您还可以为
日期
构造函数提供一年、一个月(零基)和一天的数据。MDN不仅适用于Firefox,还包括关于其他浏览器的信息。在内部,日期不是以“2/1/2000”的形式表示的,而是以UNIX时代的千秒数表示的。@MarcelKorpel当然不是(以字符串表示)。并非所有浏览器都遵循RFC 2822!遵循它只是FF的一个设计决策。我的意思是:编写代码时假设日期构造函数将理解格式为“dd/mm/yyyy”的字符串。使用FireFox,它可以在每个国家/地区使用。具有IE(例如)和“mm/dd/yyyy”格式的区域设置的第一个用户将失败。两种浏览器都遵守ES3标准,但IE假定短日期为“mm/dd/yyyy”(参见MSDN),而FF假定短日期为“dd/mm/yyyy”(参见MDN)。
d.getMonth() + 1 + "-" + d.getDate() + "-" + d.getFullYear()