Atualização de 2015
É uma pergunta antiga, mas outras perguntas novas, como:
ficar fechado como duplicado deste, então eu acho importante adicionar algumas informações novas aqui. Estou escrevendo porque fiquei com medo de pensar que as pessoas realmente copiam e colam parte do código postado aqui e o usam na produção.
A maioria das respostas aqui quer usar algumas expressões regulares complexas que correspondem formatos só alguns muito específicos e realmente fazê-lo de forma incorrecta (como correspondência janeiro 32, enquanto que não corresponde data ISO real como anunciado - ver demonstração ) ou eles tentam passar nada para aDate
construtor e desejo o melhor.
Usando Moment
Como expliquei nesta resposta , atualmente há uma biblioteca disponível para isso:
Moment.js
É uma biblioteca para analisar, validar, manipular e exibir datas em JavaScript, que possui uma API muito mais rica que as funções padrão de manipulação de datas em JavaScript.
É 12kB compactado / compactado com gz e funciona no Node.js e em outros locais:
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 o Moment, você pode ser muito específico sobre a verificação de datas válidas. Às vezes, é muito importante adicionar algumas dicas sobre o formato que você espera. Por exemplo, uma data como 22/06/2015 se parece com uma data válida, a menos que você use um formato DD / MM / AAAA. Nesse caso, essa data deve ser rejeitada como inválida. Existem algumas maneiras de dizer ao Moment qual formato você espera, por exemplo:
moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false
O true
argumento está lá, para que o Moment não tente analisar a entrada se não estiver exatamente de acordo com um dos formatos fornecidos (deve ser um comportamento padrão na minha opinião).
Você pode usar um formato fornecido internamente:
moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true
E você pode usar vários formatos como uma 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
Veja: DEMO .
Outras bibliotecas
Se você não deseja usar o Moment.js, também existem outras bibliotecas:
Atualização de 2016
Criei o módulo imoment que é como (um subconjunto de) Momento, mas sem surpresas causadas pela mutação de objetos existentes (consulte a documentação para obter mais informações).
Atualização de 2018
Hoje, recomendo usar o Luxon para manipulação de data / hora em vez de Moment, o que (diferentemente do Moment) torna todo objeto imutável, para que não haja surpresas desagradáveis relacionadas à mutação implícita de datas.
Mais informações
Veja também:
Uma série de artigos de Rob Gravelle nas bibliotecas de análise de datas do JavaScript:
Bottom line
É claro que qualquer um pode tentar reinventar a roda, escrever uma expressão regular (mas , na verdade, leia ISO 8601 e RFC 3339 antes de fazê-lo) ou chame construtores de buit-in com dados aleatórios para analisar mensagens de erro como 'Invalid Date'
(Tem certeza de que esta mensagem é exatamente o mesmo em todas as plataformas? Em todos os locais? No futuro?) ou você pode usar uma solução testada e usar seu tempo para aprimorá-la, não reinventá-la. Todas as bibliotecas listadas aqui são software livre e de código aberto.