Actualización 2015
Es una pregunta antigua pero otras preguntas nuevas como:
se cierren como duplicados de este, así que creo que es importante agregar información fresca aquí. Lo escribo porque me asusté pensando que la gente realmente copia y pega parte del código publicado aquí y lo usa en producción.
La mayoría de las respuestas aquí o bien usar expresiones regulares complejas que responden a formatos sólo algunos muy específicos y de hecho lo hacen de forma incorrecta (como ajuste de 32 de enero, cuando no coincida con la fecha ISO real como se anuncia - ver demostración ) o que tratan de pasar nada al Date
constructor y desear lo mejor.
Usando momento
Como expliqué en esta respuesta, actualmente hay una biblioteca disponible para eso:
Moment.js
Es una biblioteca para analizar, validar, manipular y mostrar fechas en JavaScript, que tiene una API mucho más rica que las funciones estándar de manejo de fechas de JavaScript.
Tiene 12kB minified / gzipped y funciona en Node.js y otros lugares:
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 puede ser muy específico sobre la verificación de fechas válidas. A veces es muy importante agregar algunas pistas sobre el formato que espera. Por ejemplo, una fecha como 22/06/2015 parece una fecha válida, a menos que use un formato DD / MM / AAAA, en cuyo caso esta fecha debe rechazarse como no válida. Hay pocas maneras de decirle a Moment qué formato espera, por ejemplo:
moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false
El true
argumento está ahí, por lo que el Momento no intentará analizar la entrada si no se ajusta exactamente a uno de los formatos proporcionados (en mi opinión, debería ser un comportamiento predeterminado).
Puede usar un formato provisto internamente:
moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true
Y puede usar múltiples formatos como una matriz:
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
Ver: DEMO .
Otras bibliotecas
Si no desea usar Moment.js, también hay otras bibliotecas:
Actualización 2016
He creado el immoment módulo que es como (un subconjunto de) Momento pero sin sorpresas causadas por mutación de objetos existentes (véase la documentación para obtener más información).
Actualización 2018
Hoy recomiendo usar Luxon para la manipulación de fecha / hora en lugar de Moment, que (a diferencia de Moment) hace que todos los objetos sean inmutables, por lo que no hay sorpresas desagradables relacionadas con la mutación implícita de fechas.
Más información
Ver también:
Una serie de artículos de Rob Gravelle en las bibliotecas de análisis de fechas de JavaScript:
Línea de fondo
Por supuesto, cualquier persona puede tratar de reinventar la rueda, escribir una expresión regular (pero por favor, lea realmente la norma ISO 8601 y RFC 3339 antes de hacerlo) o llame al buit-en los constructores con datos aleatorios a los mensajes de error de análisis como 'Invalid Date'
(¿Estás seguro de que este mensaje es exactamente igual en todas las plataformas, en todos los entornos locales, en el futuro, o puede usar una solución probada y usar su tiempo para mejorarla, no reinventarla. Todas las bibliotecas enumeradas aquí son de código abierto, software libre.