2012-08-27 14 views
6

Utilizzo della libreria javascript Date.js Sto trovando che quando passo alla funzione Date.parse() una data UTC 0 ISO 8601 in formato ottengo un oggetto rappresentativo della stessa data ma con il fuso orario locale aggiunto.Date.js che analizza in modo non corretto una data ISO 8601 UTC

Ad esempio,

Considerata la data: 2012-08-27T14: 57: 00Z (ISO 8601), che sta mostrando un tempo di 14:57 UTC, perché dovrebbe essere analizzato come 14:57 GMT-400 in contrasto con 10:57 GMT-400?

Ho created a fiddle per mostrarlo in azione.

Per favore fatemi sapere se c'è effettivamente un errore o se la mia comprensione del risultato del parsing non è corretta.

risposta

10

Sì, è un bug - anche a reported one.

Si consiglia di utilizzare invece la libreria Moment.js? Ad esempio, this:

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

... potrà riconoscere correttamente viene dato che il tempo UTC.

+3

Dopo un'ulteriore revisione, risulta che gli sviluppatori non dovrebbero più utilizzare Date.js (consultare questo link https://plus.google.com/113127438179392830442/posts/htwWUqxHmUY). Buona nota per indirizzare le persone al momento. – MindWire

+0

Perché non ho incontrato Moment.js in precedenza, ottima libreria, buona chiamata @ raina77ow :) – DIGGIDY

2

Sembra un errore con Date.js. L'utilizzo di new Date('2012-08-27T14:57:00Z') restituisce la data corretta.

+0

Si scopre sì, è un bug in Date.js. Non vedo alcun nuovo sviluppo dal 2008, quindi presumo che non sarà mai risolto. Grazie per aver notato che funziona con la nuova data (...), in quanto questa sarà la correzione che userò per il momento. – MindWire

1

È causato da un'implementazione buggy dell'analizzatore di grammatica piuttosto semplice di DateJS.

Fondamentalmente la vecchia versione appena controllata per vedere se poteva usare il parser integrato, la nuova versione prova ad usare l'analisi grammaticale ma dimentica di provare prima quel passo originale e il parser della grammatica non riesce a usare il fuso orario (che è un bug, ma uno diverso).

sostituire la funzione di analisi con questo:

$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); 
    } 
}; 

Versione aggiornata del codice di base (e sarà correggere i bug aperti in futuro) disponibile qui:

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

Problemi correlati