Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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日期ISO8601_Javascript_Date - Fatal编程技术网

JavaScript日期ISO8601

JavaScript日期ISO8601,javascript,date,Javascript,Date,从如下字符串获取Javascript日期对象的最佳方法是什么: 2011-06-02T09:34:29+02:00 ? 时区部分(显然)有问题。如果您的字符串是ISO8601字符串,您可以将其传递到日期构造函数中,然后将日期对象返回: var date = new Date('2011-06-02T09:34:29+02:00'); 不过,据了解,这在IE和其他平台上可能会有问题。为了兼容性,建议您执行以下操作: function dateFromISO8601(isostr) {

从如下字符串获取Javascript日期对象的最佳方法是什么:

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

时区部分(显然)有问题。

如果您的字符串是ISO8601字符串,您可以将其传递到日期构造函数中,然后将日期对象返回:

var date = new Date('2011-06-02T09:34:29+02:00');
不过,据了解,这在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);

IE8及以下版本,以及其他浏览器的旧版本不实现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())
(函数(){
var D=新日期('2011-06-02T09:34:29+02:00');
如果(isNaN(D)| | D.getUTCMonth()!==5 | | D.getUTCDate()!==2||
D.getUTCHours()!==7 | | D.getUTCMinutes()!==34){
Date.fromISO=函数{
var day,tz,
rx=/^(\d{4}-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/,
p=rx.exec | |[];
if(p[1]){
day=p[1]。拆分(/\D/);

对于(var i=0,L=day.length;ISO8601格式刚刚在中被标准化,在使用ES3实现的浏览器中它不会工作,因为在该版本的规范中没有描述默认格式。@CMS,很高兴知道。似乎太简单了:)@Luc,如果您支持浏览器实现ES3,请查看Eli的答案。@jason mccreary,嗯……我试图拆分字符串的每一部分并创建新的日期,您提供了此解决方案……非常感谢:)@jason mccreary,你的解决方案很好,我不依赖浏览器,这是node.js的东西。值得注意的是,ES5不支持
+0200
+02
,只支持UTC偏移量的
+02:00
。这与ISO 8601不符,ISO 8601允许
+[hh]:[mm]
+[hh][mm]
,或
+[hh]
。ECMAScript v5引入了ISO8601日期。较旧的浏览器将不支持它。当您使用新日期(SomeISODateString)时,如何防止它转换为本地日期时间…?是否考虑了时区?当您使用2011年6月2日时,它返回2010年9月20日。
(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())