Aggiornamento 2015
È una vecchia domanda ma altre nuove domande come:
chiuso come duplicati di questo, quindi penso che sia importante aggiungere alcune nuove informazioni qui. Lo sto scrivendo perché mi sono spaventato pensando che le persone effettivamente copiano e incollano parte del codice pubblicato qui e lo usano nella produzione.
La maggior parte delle risposte qui o usano espressioni regolari complesse che corrispondono solo ad alcuni formati molto specifici e lo fanno effettivamente in modo errato (come la corrispondenza del 32 gennaio senza corrispondere alla data ISO effettiva come pubblicizzata - vedi la demo ) o provano a passare qualsiasi cosa al Date
costruttore e auguro il meglio.
Utilizzando Moment
Come ho spiegato in questa risposta, al momento è disponibile una libreria per questo:
Moment.js
È una libreria per analizzare, convalidare, manipolare e visualizzare le date in JavaScript, che ha un'API molto più ricca delle funzioni standard di gestione delle date JavaScript.
È ridotto a 12kB / compresso con gzip e funziona in Node.js e in altri luoghi:
bower install moment --save # bower
npm install moment --save # npm
Install-Package Moment.js # NuGet
spm install moment --save # spm
meteor add momentjs:moment # meteor
Usando Moment puoi essere molto specifico sul controllo delle date valide. A volte è molto importante aggiungere alcuni indizi sul formato che ti aspetti. Ad esempio, una data come 22/06/2015 sembra una data valida, a meno che non si utilizzi un formato GG / MM / AAAA, nel qual caso tale data deve essere respinta in quanto non valida. Ci sono alcuni modi in cui puoi dire a Moment quale formato ti aspetti, ad esempio:
moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false
L' true
argomento è lì, quindi Moment non proverà ad analizzare l'input se non si conforma esattamente a uno dei formati forniti (secondo me dovrebbe essere un comportamento predefinito).
È possibile utilizzare un formato fornito internamente:
moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true
E puoi usare più formati come un array:
var formats = [
moment.ISO_8601,
"MM/DD/YYYY :) HH*mm*ss"
];
moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true
moment("06/22/2015 :) 13*17*21", formats, true).isValid(); // true
moment("06/22/2015 :( 13*17*21", formats, true).isValid(); // false
Vedi: DEMO .
Altre biblioteche
Se non vuoi usare Moment.js, ci sono anche altre librerie:
Aggiornamento 2016
Ho creato il modulo immoment che è simile a (un sottoinsieme di) Moment ma senza sorprese causate dalla mutazione di oggetti esistenti (vedi i documenti per maggiori informazioni).
Aggiornamento 2018
Oggi raccomando di usare Luxon per la manipolazione di data / ora anziché Moment, che (a differenza di Moment) rende immutabili tutti gli oggetti, quindi non ci sono brutte sorprese legate alla mutazione implicita delle date.
Ulteriori informazioni
Guarda anche:
Una serie di articoli di Rob Gravelle sulle librerie di analisi della data JavaScript:
Linea di fondo
Ovviamente chiunque può provare a reinventare la ruota, scrivere un'espressione regolare (ma per favore leggi ISO 8601 e RFC 3339 prima di farlo) o chiama i costruttori incorporati con dati casuali per analizzare i messaggi di errore come 'Invalid Date'
(Sei sicuro che questo messaggio sia esattamente lo stesso su tutte le piattaforme? In tutte le versioni locali? In futuro?) oppure puoi usare una soluzione testata e usare il tuo tempo per migliorarla, non reinventarla. Tutte le librerie elencate qui sono software libero e open source.