2011-06-03 16 views
18

¿Cuál es la mejor manera de conseguir un objeto Date de JavaScript de una cadena como la siguiente:JavaScript Fecha ISO8601

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

tengo problemas con la parte de zona horaria (obviamente).

+0

fechas ISO8601 fueron introducidos con v5 ECMAScript. Los navegadores antiguos no lo soportarán. –

+0

cuando usa una nueva fecha (SomeISODateString), cómo evitar que se convierta en hora local ...? – bhargav

Respuesta

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

El formato ISO8601 acaba de ser estandarizado en [ECMAScript 5] (http://es5.github.com/#x15.9.1.15), en navegadores con implementaciones de ES3 no funcionará, ya que no había un * formato predeterminado * descrito en esa versión de la especificación. – CMS

+0

@CMS, es bueno saberlo. Parecía demasiado fácil :) @Luc, revisa ** la respuesta ** de Eli si estás apoyando navegadores que implementan ES3. –

+0

@ jason-mccreary, hmmm .... Estaba tratando de dividir cada parte de la cadena y construir una nueva fecha y vienes con esta solución ... Bueno, muchas gracias :) – Luc

5

Si la cadena es una cadena ISO8601, que sólo puede pasar en el constructor Fecha y obtener un objeto se remontan a cabo:

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

Según http://dev.enekoalonso.com/2010/09/21/date-from-iso-8601-string/ embargo, esto podría tener problemas en el IE y otras plataformas. Se recomienda que usted hace algo como esto para la compatibilidad:

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

¿se tiene en cuenta la zona horaria? Devuelve el 20 de septiembre de 2010 cuando utiliza el 02 de junio de 2011. – Luc

7

IE 8 y siguientes, y las versiones anteriores de los otros navegadores no implementan el formato de fecha ISO. Un problema es que algunos navegadores devuelven una fecha, en lugar de NaN, simplemente no la correcta.

Puede escribir su propio método, si desea darles soporte. El huso horario es el truco.

Este ejemplo se ejecutará una vez y configurará un método Date.fromISO; si se admite el método nativo, lo usará.

(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()) 
Cuestiones relacionadas