【问题标题】:Date function not working in IE8日期功能在 IE8 中不起作用
【发布时间】:2014-09-16 19:08:38
【问题描述】:

我有以下在 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 的警报。

【问题讨论】:

  • 可能想看看this fix (IE Alert)

标签: javascript jquery internet-explorer-8


【解决方案1】:

IE 似乎不支持该格式

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

【讨论】:

  • 嗯嗯嗯是也不是,这种格式很不标准。 IMO FF 和 Safari 都无法理解它(并且它取决于语言环境)。
【解决方案2】:

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

【讨论】:

  • “您确定每个浏览器都会读取的唯一格式是 YYYY-MM-DDTHH:mm:ss.sssZ” 这是不正确的:它是 ISO 8601 格式的一个版本,仅受浏览器支持支持 ECMAScript 5。所有浏览器唯一支持的标准是RFC 2822Source
  • @MarcelKorpel 对不起,你错了。适用于 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 这样的旧浏览器。此外,您可以为 Date 构造函数提供一年、一个月(从零开始)和一个天,也是。 MDN 不仅适用于 Firefox,还包括有关其他浏览器的信息。在内部,日期不是像“2/1/2000”那样表示,而是以 UNIX 纪元的毫秒数表示。
  • @MarcelKorpel 当然不是(表示为字符串)。所有浏览器都遵循 RFC 2822!遵循它只是 FF 的设计决策。我的意思是:您编写代码时假设 Date 构造函数将理解格式为“dd/mm/yyyy”的字符串。使用 FireFox,它适用于每个国家/地区。第一个使用 IE(例如)和“mm/dd/yyyy”格式的语言环境的用户将失败。两种浏览器都遵循 ES3 标准,但 IE 假定短日期为“mm/dd/yyyy”(参见 MSDN),而 FF 假定为“dd/mm/yyyy”(参见 MDN)。
猜你喜欢
  • 2014-03-28
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多