JavaScript:哪些浏览器支持使用Date.parse解析ISO-8601日期字符串

cat*_*cat 48 javascript safari internet-explorer datetime

我没能在IE8和Safari 5上解析ISO-8601日期"2011-04-26T13:16:50Z",但它适用于Chrome 10,FF4.支持似乎很混杂?

有谁知道哪些浏览器可以解析这种格式的实际状态?我假设IE6,7也会失败.

var d = Date.parse("2011-04-26T13:16:50Z");
Run Code Online (Sandbox Code Playgroud)

cko*_*ozl 32

我说只有通过一些测试才需要它,

这是我已经写过的:

(function() {

var d = window.Date,
    regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})(?:Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/;

if (d.parse('2011-11-29T15:52:30.5') !== 1322581950500 ||
    d.parse('2011-11-29T15:52:30.52') !== 1322581950520 ||
    d.parse('2011-11-29T15:52:18.867') !== 1322581938867 ||
    d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
    d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
    d.parse('2011-11-29') !== 1322524800000 ||
    d.parse('2011-11') !== 1320105600000 ||
    d.parse('2011') !== 1293840000000) {

    d.__parse = d.parse;

    d.parse = function(v) {

        var m = regexIso8601.exec(v);

        if (m) {
            return Date.UTC(
                m[1],
                (m[2] || 1) - 1,
                m[3] || 1,
                m[4] - (m[8] ? m[8] + m[9] : 0) || 0,
                m[5] - (m[8] ? m[8] + m[10] : 0) || 0,
                m[6] || 0,
                ((m[7] || 0) + '00').substr(0, 3)
            );
        }

        return d.__parse.apply(this, arguments);

    };
}

d.__fromString = d.fromString;

d.fromString = function(v) {

    if (!d.__fromString || regexIso8601.test(v)) {
        return new d(d.parse(v));
    }

    return d.__fromString.apply(this, arguments);
};

})();
Run Code Online (Sandbox Code Playgroud)

并且在你的代码中总是使用Date.fromString(...)而不是new Date(...)

测试浏览器以查看是否将使用垫片:

http://jsbin.com/efivib/1/edit

适用于所有主流浏览器,使用以下引用:

http://dev.w3.org/html5/spec/common-microsyntaxes.html

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

http://msdn.microsoft.com/en-us/library/windows/apps/ff743760(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/windows/apps/wz6stk2z(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/windows/apps/k4w173wk(v=vs.94).aspx

! - microsoft connect需要登录才能查看:

IE9在毫秒级失败,数字计数不是3 :(在IE10中修复) https://connect.microsoft.com/IE/feedback/details/723740/date-parse-and-new-date-fail-on-valid -格式

当省略时区时,IE10仍然(截至2013年1月17日)失败(根据ECMA,这应该定义为Z或UTC,而不是本地):https://connect.microsoft.com/IE/feedback/ 细节/ 776783 /日期语法分析和新日期-失败-上有效的格式

- 如果您关心标准现在/将来的位置以及为什么我不能让IE团队认识到他们的IE10实现在技术上不正确,请阅读此内容:

ECMAScript-262 v6.0将转向稍微更符合iso8601的版本"如果省略时区指示器,假定当地时间"......所以现在存在差异,这种实现,chrome,移动safari和opera all遵循ECMAScript-262 v5.1,而IE10,firefox,桌面游戏似乎都遵循更符合iso8601标准的ECMAScript-262 v6.0规范...这至少令人困惑.当chrome或移动safari拉动触发器并转移到ES6实现时,我认为这个实现应该与它一起使ES5.1成为少数.我已经读过,这是在5.1版的"勘误表"中列出的,虽然我还没有找到它.我更倾向于认为现在推动ES6的触发还为时尚早,但我也认为代码需要实用,不理想,并转向浏览器制造商转向的地方.也就是说,它现在似乎是一个50/50的决定,所以下面是这个代码的"未来"版本......

我还应该提一下,任何一个版本的代码都会规范化"不兼容"的浏览器以匹配另一个浏览器的行为,因为这就是垫片的作用;)

这里适应的版本与ECMAScript-262 v6.0兼容(JavaScript未来)

请参阅此处的相关部分:(这是我能找到的唯一在线html版本的规范)http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.9.1.15

(function() {

    var d = window.Date,
        regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,})(Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/,
        lOff, lHrs, lMin;

    if (d.parse('2011-11-29T15:52:30.5') !== 1322599950500 ||
        d.parse('2011-11-29T15:52:30.52') !== 1322599950520 ||
        d.parse('2011-11-29T15:52:18.867') !== 1322599938867 ||
        d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
        d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
        d.parse('2011-11-29') !== 1322524800000 ||
        d.parse('2011-11') !== 1320105600000 ||
        d.parse('2011') !== 1293840000000) {

        d.__parse = d.parse;

        lOff = -(new Date().getTimezoneOffset());
        lHrs = Math.floor(lOff / 60);
        lMin = lOff % 60;

        d.parse = function(v) {

            var m = regexIso8601.exec(v);

            if (m) {
                return Date.UTC(
                    m[1],
                    (m[2] || 1) - 1,
                    m[3] || 1,
                    m[4] - (m[8] ? m[9] ? m[9] + m[10] : 0 : lHrs) || 0,
                    m[5] - (m[8] ? m[9] ? m[9] + m[11] : 0 : lMin) || 0,
                    m[6] || 0,
                    ((m[7] || 0) + '00').substr(0, 3)
                );
            }

            return d.__parse.apply(this, arguments);

        };
    }

    d.__fromString = d.fromString;

    d.fromString = function(v) {

        if (!d.__fromString || regexIso8601.test(v)) {
            return new d(d.parse(v));
        }

        return d.__fromString.apply(this, arguments);
    };

})();
Run Code Online (Sandbox Code Playgroud)

希望这有助于确定

  • @ckozl 当然,我明白。但是,如果您在符合 v6 的浏览器上运行该 shim,它将适用,因为它将非 TZ 解析为与常量不匹配的本地时间。在符合 v6 的实现中,我建议这个垫片应该*不*激活 (2认同)

Ole*_*ika 18

在任何浏览器中解析ISO8601日期格式的简单功能:

function dateFromISO8601(isoDateString) {
  var parts = isoDateString.match(/\d+/g);
  var isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
  var isoDate = new Date(isoTime);

  return isoDate;
}
Run Code Online (Sandbox Code Playgroud)


asg*_*eo1 17

我今天遇到了这个问题.我发现momentjs是在跨浏览器庄园中解析ISO 8601日期的好方法.

momentjs也可用于以不同的格式输出日期.


Vik*_*vid 6

是的,Date.parse对于不同的浏览器不一致.你可以:

  • 需要注意的是,它是jQuery UI datepicker的parseDate.原生jQuery没有日期解析库.虽然我认为它非常需要一个.Javascript的日期实现很糟糕! (6认同)
  • 另一个注意事项:jQuery UI的parseDate方法实际上只解析日期 - 它根本不处理时间. (4认同)