Risposta breve:
E 'un misbehaviuor dei browser che stai citano.
È necessario controllare la data nel formato corretto per conto proprio.Ma è abbastanza banale, suggerisco questo approccio:
Split data nell'anno y
, mese m
, giorno d
e creare l'oggetto Date
:
var date = new Date(y, m - 1, d); // note that month is 0 based
quindi confrontare i valori originali con i logiche valori ottenuti utilizzando i metodi Date
:
var isValid = date.getDate() == d &&
date.getMonth() == m-1 &&
date.getFullYear() == y;
Prima di fare tutto questo si consiglia di controllare se la stringa data è valida per qualsiasi del browser:
Detecting an "invalid date" Date instance in JavaScript
Risposta lunga:
Firefox (e IE) accettando "2/8888/2016 "come un corretto formato di stringa sate sembra essere un bug/comportamento scorretto.
Infatti secondo ECMAScript 2015 Language Specification quando Date()
viene richiamato con un singolo argomento stringa dovrebbe comportarsi come Date.parse()
http://www.ecma-international.org/ecma-262/6.0/#sec-date-value
Quest'ultimo
tentativi per analizzare il formato della stringa in base alle regole (compresi gli anni estesi) richiamati in Formato stringa data e ora (20.3.1.16)
..che è specificato qui
http://www.ecma-international.org/ecma-262/6.0/#sec-date-time-string-format
dove si può leggere
Il formato è il seguente: YYYY-MM-GGTHH: mm: ss.sssZ
[...]
MM è il mese dell'anno dal 01 (gennaio) t o 12 (dicembre).
GG è il giorno del mese dalle 01 alle 31.
Sembra che Firefox è interpretare il valore della stringa come quando Date()
viene richiamato con più argomenti.
Da
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Nota: Dove Data si chiama come un costruttore con più di un argomento, se i valori sono superiori la loro gamma di logica (ad esempio 13 è fornito come il valore del mese o 70 per il valore minuto), il valore adiacente verrà regolato. Per esempio. new Date (2013, 13, 1) equivale a new Date (2014, 1, 1), entrambi creano una data per il 2014-02-01 (si noti che il mese è basato su 0). Analogamente per altri valori: new Date (2013, 2, 1, 0, 70) equivale a new Date (2013, 2, 1, 1, 10) che entrambi creano una data per 2013-03-01T01: 10: 00.
Questo potrebbe spiegare come "2/8888/2016"
si trasforma in 2040-05-31T22:00:00.000Z
Si può sempre controllare il numero dividendo la stringa e controllando se '8888' è maggiore di 31 – Derek
anche, a causa dei problemi di' time' in javascript (proprio come java, lol), io uso: http://momentjs.com/ per colmare il divario. – Derek
@DerekPollard fallisce il 31/11 e come bonus si arriva a scrivere la propria logica dell'anno bisestile. – djechlin