Qual é uma maneira fácil de verificar se um valor é uma data válida, é permitido qualquer formato de data conhecido.
Por exemplo, eu tenho os valores 10-11-2009
, 10/11/2009
, 2009-11-10T07:00:00+0000
que devem todos ser reconhecidos como valores de data e os valores 200
, 10
, 350
, que não deve ser reconhecido como um valor de data. Qual é a maneira mais simples de verificar isso, se isso é possível? Porque os timestamps também seriam permitidos.
javascript
date-format
Thizzer
fonte
fonte
Respostas:
Seria
Date.parse()
suficiente?Veja sua página relativa à documentação MDN .
fonte
Date.parse("4.3")
é986270400000
.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 a
Date
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:
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:
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:
E você pode usar vários formatos como uma matriz:
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.fonte
moment("whatever 123").isValid()
retornatrue
.moment("06/22/2015", "DD/MM/YYYY", true).isValid();
com o formato de data esperado explicitamente fornecido e com um argumento quetrue
significa verificação rigorosa. Atualizei minha resposta com mais informações e melhores exemplos.Foi assim que resolvi esse problema em um aplicativo no qual estou trabalhando agora:
atualizado com base nos comentários da krillgar:
fonte
new Date(date)
não fornece "Data inválida".new Date(date) !== "Invalid Date"
vai sempre retornar verdadeiro pois a expressão esquerdo retornará um objeto Date com uma TimeValue de NaN , que nunca pode ser===
para uma string. Usando==
"funciona" devido à conversão de tipo. Porém, como a análise de strings de data ainda depende em grande parte da implementação, confiando nela para analisar formatos aleatórios que são seriamente falhos.isDate('Mac OS X 10.14.2')
retorna verdadeiro aqui.new Date(date) === 'Invalid Date'
só funciona no Firefox e Chrome. O IE8 (o que eu tenho na minha máquina para fins de teste) fornece NaN.Como foi afirmado na resposta aceita,
Date.parse(date)
também funcionará para números. Portanto, para contornar isso, você também pode verificar se não é um número (se é algo que você deseja confirmar).fonte
isNan
não é uma função; caso incorreto na primeira instância.date
forFoostreet 1
, sua condição é avaliada como verdadeira.Que tal algo como isso? Ele testará se é um objeto Date ou uma string de data:
Devo mencionar que isso não testa cadeias de caracteres formatadas em ISO, mas com um pouco mais de trabalho no RegExp você deve ser bom.
fonte
Nenhuma das respostas aqui aborda a verificação se a data é inválida, como 31 de fevereiro. Esta função aborda isso verificando se o mês retornado é equivalente ao mês original e certificando-se de que um ano válido foi apresentado.
fonte
Use Expressão regular para validá-la.
fonte
Ao me referir a todos os comentários acima, cheguei a uma solução.
Isso funciona se o
Date
passado estiver no formato ISO ou precisar manipular para outros formatos.Você pode jogar aqui no JSFiddle.
fonte
YYYY-MM-DD
, portanto, é trivial anexarT00:00:00.000Z
e usar essa solução para verificar se há strings válidas.Aqui está uma função aprimorada que usa apenas
Date.parse()
:Nota: Date.parse () analisará os números: por exemplo
Date.parse(1)
, retornará uma data. Então aqui verificamos ses
não é um número, se é uma data.fonte
Eu faria isso
Jogue aqui
fonte
EXAMPLE STRING 12345
e retorna "Data válida".Aqui está uma versão minimalista.
fonte
isDate(" 1")
Esta função solicitável funciona perfeitamente, retorna true para data válida. Certifique-se de ligar usando uma data no formato ISO (aaaa-mm-dd ou aaaa / mm / dd):
fonte
return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
Sei que é uma pergunta antiga, mas enfrentei o mesmo problema e vi que nenhuma das respostas funcionava corretamente - eliminando números (1.200.345 etc.) de datas, que é a pergunta original. Aqui está um método pouco ortodoxo em que pude pensar e parece funcionar. Por favor, indique se há casos em que ele falhará.
Esta é a linha para eliminar números. Assim, toda a função pode se parecer com:
fonte
console.log("hello 1 ", isDate("hello 1 "));
Retorna true #é bom verificar se uma função relacionada à data está disponível para o objeto descobrir se é um objeto de data ou não?
gostar
fonte
É assim que acabo fazendo isso. Isso não cobrirá todos os formatos. Você tem que ajustar em conformidade. Eu tenho controle sobre o formato, então funciona para mim
fonte
Ok, essa é uma pergunta antiga, mas encontrei outra solução enquanto verifica as soluções aqui. Para mim trabalha para verificar se a função getTime () está presente no objeto de data:
fonte
Uma biblioteca leve está pronta para você: Day.js
fonte
Por padrão, isso é definido como TRUE. Assim, mesmo seqüências de caracteres de formato incorreto retornam bons valores.
Eu usei algo assim:
fonte
Tente o seguinte:
fonte