2015-09-02 10 views
7

Se specifico YYYY-MM-17 come data per moment.js, si dice che è una data valida:moment.js sta facendo cose strane quando analizza una data mal formattato

var myMoment = moment('YYYY-MM-17', 'YYYY-MM-DD'); 

console.log(myMoment.isValid()); // -> true 

console.log(myMoment.get('year')); // -> 2017 
console.log(myMoment.get('month')); // -> 0 
console.log(myMoment.get('day')); // -> 0 

https://jsfiddle.net/seu6x3k3/3/

I' m vedendo anche risultati diversi su diversi browser. Secondo il docs:

... per prima cosa controlla se la stringa corrisponde ISO 8601 nota formati, per poi cadere di nuovo a new Date(string) se un formato noto non viene trovato.

Questo non è quello che sto vedendo. Quando nativamente specificare una data utilizzando lo stesso formato:

var date = new Date('YYYY-MM-17'); // -> NaN 

console.log(date.getYear()); // -> NaN 
console.log(date.getMonth()); // -> NaN 
console.log(date.getDay()); // -> NaN 

https://jsfiddle.net/3p5x1qn3/

+0

Ho cercato di rispondere a questa, ma ho dovuto rinunciare quando ho scoperto che Moment tratta 'momento ('foo-bar-17'), come non valida, ma' momento ('foo- ' bar-1 ') 'fino a' momento (' foo-bar-12 ') 'come gennaio al 1 ° dicembre 2001. Non sono sicuro dei diversi risultati che stai vedendo, ma potrebbe essere correlato a [questa domanda I risposto qualche settimana fa] (http://stackoverflow.com/q/32007167/1317805). –

+0

Grazie James. Abbiamo scoperto che esiste un'opzione "rigorosa" per l'analisi. Ha pubblicato la mia risposta qui sotto. – sennett

risposta

1

risulta là è una scelta rigorosa. Da docs:

Il parser di Moment è molto tollerante e questo può portare a comportamenti indesiderati. A partire dalla versione 2.3.0, è possibile specificare un valore booleano per l'ultimo argomento per fare in modo che Moment utilizzi un'analisi rigorosa. L'analisi rigorosa richiede che il formato e l'input corrispondano esattamente.

var myMoment = moment('YYYY-MM-17', 'YYYY-MM-DD', true); 

console.log(myMoment.isValid()); // -> false 

console.log(myMoment.get('year')); // -> 2016 
console.log(myMoment.get('month')); // -> 4 
console.log(myMoment.get('day')); // -> 0 

https://jsfiddle.net/seu6x3k3/5/