【问题标题】:How do I get Internet Explorer to parse "2010-06-09T15:20:00Z" as a date?如何让 Internet Explorer 将“2010-06-09T15:20:00Z”解析为日期?
【发布时间】:2011-08-16 03:17:11
【问题描述】:

我正在使用 JavaScript 处理组合 UTC 格式的日期(例如“2010-06-09T15:20:00Z”)。 IE 没有给出预期的结果(震惊)。以下产生NaN。

var d = new Date("2010-06-09T15:20:00Z");  // NaN

但是,此页面上的 Microsoft 文档说这应该可以工作(就像在 FF 中一样)。我什至从这个页面复制了 JScript 代码,但它无法运行,给出了我在工作中发现的相同错误。 (有点让你想知道 MS 在发布之前是否对其进行了测试,或者 IE 是否由于补丁而损坏)。

Formatting Date and Time String (msdn.microsoft.com)

我可以通过删除“T”并将破折号切换为斜杠来让 IE 解析类似的字符串。这样做的问题是我失去了时间的偏移逻辑。

关于如何在 IE 中解决此问题的任何建议。我已经在 IE6 和 IE7(兼容模式)中测试过了。我没有要检查的其他 Windows 系统。

【问题讨论】:

标签: javascript datetime date time utc


【解决方案1】:

我喜欢使用Datejs - An open-source JavaScript Date Library 进行无忧的日期操作,它在日期方面做了很多很棒的事情,使用它的主要成本是26kb 的文件大小。

它将解析"2010-06-09T15:20:00Z"

【讨论】:

  • 我根本不会使用它来获取日期对象。但是,如果您想要 NLP 糖,那么我会推荐它 A+ :)
【解决方案2】:
Date.fromISO= (function(){
    var diso= Date.parse('2011-04-26T13:16:50Z');
    if(diso=== 1303823810000) return function(s){
        return new Date(Date.parse(s));
    }
    else return function(s){
        var day, tz, 
        rx= /^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/, 
        p= rx.exec(s) || [];
        if(p[1]){
            day= p[1].split(/\D/).map(function(itm){
                return parseInt(itm, 10) || 0;
            });
            day[1]-= 1;
            day= new Date(Date.UTC.apply(Date, day));
            if(!day.getDate()) return NaN;
            if(p[5]){
                tz= parseInt(p[5], 10)*60;
                if(p[6]) tz += parseInt(p[6], 10);
                if(p[4]== "+") tz*= -1;
                if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
            }
            return day;
        }
        return NaN;
    }
})()

【讨论】:

    【解决方案3】:

    我对扩展 Javascript 核心对象的想法感到畏缩,因此我倾向于使用它们。完全归功于 Paul Sowden

        var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
            "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
            "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
        var d = string.match(new RegExp(regexp));
    
        var offset = 0;
        var time;
        var date = new Date(d[1], 0, 1);
    
        if (d[3]) { date.setMonth(d[3] - 1); }
        if (d[5]) { date.setDate(d[5]); }
        if (d[7]) { date.setHours(d[7]); }
        if (d[8]) { date.setMinutes(d[8]); }
        if (d[10]) { date.setSeconds(d[10]); }
        if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
        if (d[14]) {
            offset = (Number(d[16]) * 60) + Number(d[17]);
            offset *= ((d[15] == '-') ? 1 : -1);
        }
    
        offset -= date.getTimezoneOffset();
        time = (Number(date) + (offset * 60 * 1000));
        date.setTime(Number(time));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2017-10-14
      相关资源
      最近更新 更多