JavaScript日期ISO8601

20

如何从以下类似字符串中获取JavaScript日期对象的最佳方法:

2011-06-02T09:34:29+02:00 ?

我在时区部分遇到了困难(显然)。


ISO8601日期是在ECMAScript v5中引入的。旧浏览器不支持它。 - Jürgen Thelen
当您使用 new Date(SomeISODateString) 时,如何防止其转换为本地日期时间...? - bhargav
3个回答

24
var myDate = new Date('2011-06-02T09:34:29+02:00');
alert(myDate);

5
ISO8601格式刚刚在ECMAScript 5中被标准化。在使用ES3实现的浏览器中,它将无法工作,因为该规范版本中没有描述默认格式 - Christian C. Salvadó
@CMS,好知道。看起来太简单了 :) @Luc,如果你正在支持实现ES3的浏览器,请查看Eli的答案。 - Jason McCreary
@jason-mccreary,嗯...我试图分割字符串的每一位并构建一个新日期,而你提供了这个解决方案...好的,非常感谢 :) - Luc
1
@jason-mccreary,你的解决方案很好,我不依赖于浏览器,这是node.js的东西。 - Luc
1
值得注意的是,ES5不支持+0200+02,而只支持+02:00用于UTC偏移量。这与ISO 8601不一致,后者允许使用±[hh]:[mm]±[hh][mm]±[hh] - Marcel Stör

7

IE 8及以下版本以及其他旧版浏览器不支持ISO日期格式。问题在于,一些浏览器返回的是一个日期,而不是NaN,但并不正确。

如果你想支持这些浏览器,可以自己编写方法。时区是棘手的部分。

此示例将运行一次并设置Date.fromISO方法-如果本机方法受支持,则使用它。

(function(){
var D= new Date('2011-06-02T09:34:29+02:00');
if(isNaN(D) || D.getUTCMonth()!== 5 || D.getUTCDate()!== 2 ||
D.getUTCHours()!== 7 || D.getUTCMinutes()!== 34){
    Date.fromISO= 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/);
            for(var i= 0, L= day.length; i<L; i++){
                day[i]= parseInt(day[i], 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;
    }
    // remove test:
    alert('ISO Date Not correctly implemented');
}
else{
    Date.fromISO= function(s){
        return new Date(s);
    }
    // remove test:
    alert('ISO Date implemented');
}
})()


// remove test
var D=Date.fromISO('2011-06-02T09:34:29+02:00');
alert(D.toUTCString())

5

如果您的字符串是ISO8601格式的,您可以将其直接传递给Date构造函数,并获得一个Date对象:

var date = new Date('2011-06-02T09:34:29+02:00');

根据http://dev.enekoalonso.com/2010/09/21/date-from-iso-8601-string/的说法,这种方法在IE和其他平台上可能存在问题。为了兼容性,建议您采用以下方法:

function dateFromISO8601(isostr) {
    var parts = isostr.match(/\d+/g);
    return new Date(parts[0], parts[1] – 1, parts[2], parts[3], parts[4], parts[5]);
}

var myDate = dateFromISO8601("2011-06-02T09:34:29+02:00");
console.log(myDate);

2
时区是否被考虑在内?当您使用2011年6月2日时,它返回2010年9月20日。 - Luc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接