2012-08-27 24 views
6

Uso de la biblioteca javascript Date.js Estoy descubriendo que cuando paso a la función Date.parse() una fecha UTC 0 formateada ISO 8601 obtengo un objeto que es representativo de la misma fecha pero con la zona horaria local agregada.Date.js analizando incorrectamente una fecha UTC ISO 8601

Por ejemplo,

Dada la fecha: 2012-08-27T14: 57: 00Z (en formato ISO 8601), que está mostrando un tiempo de 14:57 UTC, por qué esto se analiza como 14:57 GMT-400 a diferencia de 10:57 GMT-400?

Tengo created a fiddle para mostrarlo en acción.

Háganme saber si hay un error o si mi entendimiento del resultado del análisis es incorrecto.

Respuesta

10

Sí, es un error - incluso a reported one.

¿Puedo recomendar el uso de la biblioteca Moment.js en su lugar? Por ejemplo, this:

console.log(moment('2012-08-27T14:57:00Z').toString());

... reconocerán correctamente que se dé la hora UTC.

+3

Después de una revisión posterior, resulta que los desarrolladores ya no deberían usar Date.js (ver este enlace https://plus.google.com/113127438179392830442/posts/htwWUqxHmUY). Buena nota para dirigir a las personas al momento. – MindWire

+0

¿Por qué no me he encontrado con Moment.js antes, excelente biblioteca, buena llamada @ raina77ow :) – DIGGIDY

2

Parece un error con Date.js. El uso de new Date('2012-08-27T14:57:00Z') devuelve la fecha correcta.

+0

Resulta sí, es un error en Date.js. No veo ningún desarrollo nuevo desde 2008, así que supongo que nunca será reparado. Gracias por señalar que funciona con una nueva Fecha (...), ya que será la solución que usaré por el momento. – MindWire

1

Es causado por una implementación defectuosa del analizador gramatical de DateJS, que de otro modo sería increíble.

Básicamente, la versión anterior simplemente verifica si podría usar el analizador integrado, la nueva versión intenta usar el análisis gramatical pero olvida probar ese paso original primero y el analizador gramatical falla al usar la zona horaria (que es un error, pero uno diferente).

reemplazar la función de análisis sintáctico con éste:

$D.parse = function (s) { 
    var date, time, r = null; 
    if (!s) { 
     return null; 
    } 
    if (s instanceof Date) { 
     return s; 
    } 

    date = new Date(Date._parse(s)); 
    time = date.getTime(); 
    // The following will be FALSE if time is NaN which happens if date is an Invalid Date 
    // (yes, invalid dates are still date objects. Go figure.) 
    if (time === time) { 
     return date; 
    } else { 
     // try our grammar parser 
     try { 
      r = $D.Grammar.start.call({}, s.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1")); 
     } catch (e) { 
      return null; 
     } 
     return ((r[1].length === 0) ? r[0] : null); 
    } 
}; 

Versión actualizada del código del núcleo (y se corrigiendo errores abiertos en el futuro) disponible aquí:

https://github.com/abritinthebay/datejs/

Cuestiones relacionadas