Gostaria de dizer a diferença entre objetos de data válidos e inválidos em JS, mas não consegui descobrir como:
var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'
Alguma idéia para escrever uma isValidDate
função?
- Ash é recomendado
Date.parse
para analisar cadeias de datas, o que fornece uma maneira autorizada de verificar se a cadeia de datas é válida. - O que eu preferiria, se possível, é fazer com que minha API aceite uma instância Date e seja capaz de verificar / afirmar se é válida ou não. A solução da Borgar faz isso, mas preciso testá-la nos navegadores. Também me pergunto se existe uma maneira mais elegante.
- Ash me fez pensar em não ter minha API aceitar
Date
instâncias, isso seria mais fácil de validar. - Borgar sugeriu testes para uma
Date
instância e, em seguida, testes para oDate
valor de tempo do. Se a data for inválida, o valor da hora éNaN
. Eu verifiquei com ECMA-262 e esse comportamento está no padrão, que é exatamente o que estou procurando.
javascript
date
orip
fonte
fonte
return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
Respostas:
Aqui está como eu faria isso:
Atualização [31-05-2018] : se você não estiver preocupado com objetos Date de outros contextos JS (janelas, quadros ou iframes externos), este formato mais simples pode ser preferido:
fonte
d.getTime
apenasisNan(d)
d instanceof Date && !isNaN(d.getTime())
1
por exemplo, ainda teria uma data válida, resultando naMon Jan 01 2001 00:00:00
qual é realmente uma data, no entanto, para a finalidade do meu aplicativo, é completamente inútil . Portanto, há pelo menos mais alguma validação de entrada necessária no meu caso. Esta resposta valida umdateObject
não aDate
!Em vez de usar,
new Date()
você deve usar:Date.parse()
retorna um registro de data e hora, um número inteiro que representa o número de milissegundos desde 01 / jan / 1970. Ele retornaráNaN
se não puder analisar a sequência de datas fornecida.fonte
Date.parse
depende da implementação e definitivamente não é confiável para analisar sequências de datas gerais. Não existe um formato único que seja analisado corretamente em navegadores populares, muito menos em todos os que estão em uso (embora, eventualmente, o formato ISO8601 especificado no ES5 esteja ok).new Date('foo')
que é basicamente equivalente aoDate.parse('foo')
método. Veja: developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/… Então, o que o @RobG disse, também se aplica a ele.Você pode verificar a validade de um
Date
objetod
viaPara evitar problemas de estrutura cruzada, pode-se substituir a
instanceof
verificação porUma chamada para
getTime()
como na resposta de Borgar é desnecessáriaisNaN()
eisFinite()
ambas implicitamente se convertem em número.fonte
isFinite()
é para isso -toString.call()
é apenas um substituto para ainstanceof
parte do cheque #isFinite
maisisNaN
(ambas funcionam bemDate(Infinity)
). Além disso, se você quiser a condição oposta, ele fica um pouco mais simples:if (!(date instanceof Date) || isNaN(date))
.Minha solução é simplesmente verificar se você obtém um objeto de data válido:
Implementação
Uso
fonte
isNaN
é uma forma mais explícita para testar NaNisNaN("a") === true
enquanto("a" !== "a") === false
. Vale a pena pensar. +1new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)
. Se você estiver passando uma sequência para o construtor de datas, deverá passar uma sequência padronizada para obter um resultado confiável. Especificamente, "A cadeia de caracteres deve estar em um formato reconhecido pelo método Date.parse ()". developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…resposta mais curta para verificar a data válida
fonte
date && !isNaN(date.getTime())
date
não for do tipo Data. Por exemplo:var date = 4; date && !isNaN(date.getTime());
.date instanceof Date && !isNaN(date.getTime())
Você pode simplesmente usar o moment.js
Aqui está um exemplo:
A seção de validação na documentação é bastante clara.
E também, os seguintes sinalizadores de análise resultam em uma data inválida:
overflow
: Um estouro de um campo de data, como um 13º mês, um 32º dia do mês (ou um 29 de fevereiro em anos não bissextos), um 367º dia do ano etc. O excesso contém o índice da unidade inválida para combinar #invalidAt (veja abaixo); -1 significa que não há excesso.invalidMonth
: Um nome de mês inválido, como momento ('março', 'MMMM') ;. Contém a própria sequência de meses inválida ou nula.empty
: Uma sequência de entrada que não contém nada analisável, como moment ('this is absurdo') ;. Boleano.Fonte: http://momentjs.com/docs/
fonte
moment("11/06/1986", "DD/MM/YYYY").isValid();
Gostaria de mencionar que o widget DateQuicker da interface do usuário do jQuery possui um método utilitário de validador de data muito bom que verifica o formato e a validade (por exemplo, não são permitidas datas em 01/33/2013).
Mesmo se você não quiser usar o widget datepicker em sua página como um elemento da interface do usuário, sempre poderá adicionar sua biblioteca .js à sua página e chamar o método validador, passando o valor que deseja validar para ela. Para tornar a vida ainda mais fácil, é necessária uma string como entrada, não um objeto Data JavaScript.
Veja: http://api.jqueryui.com/datepicker/
Não está listado como um método, mas está lá - como uma função de utilitário. Pesquise na página por "analisado" e você encontrará:
$ .datepicker.parseDate (formato, valor, configurações) - Extrai uma data de um valor de sequência com um formato especificado.
Exemplo de uso:
(Mais informações sobre a especificação de formatos de data podem ser encontradas em http://api.jqueryui.com/datepicker/#utility-parseDate )
No exemplo acima, você não veria a mensagem de alerta, já que '01 / 03/2012 'é uma data válida do calendário no formato especificado. No entanto, se você criou 'stringval' igual a '13/04/04', por exemplo, você receberia a mensagem de alerta, pois o valor '13/04/04' não é válido para o calendário.
Se um valor de string passado for analisado com êxito, o valor de 'testdate' seria um objeto Data Javascript que representa o valor da sequência passada. Caso contrário, seria indefinido.
fonte
Eu realmente gostei da abordagem de Christoph (mas não tinha reputação suficiente para votar). Para meu uso, eu sei que sempre terei um objeto Date, então apenas estendi a data com um método válido ().
Agora eu posso escrever isso e é muito mais descritivo do que apenas verificar isFinite no código ...
fonte
isFinite
trabalho para mim perfeitamente. Mas sim, não faz sentido estender o protótipo.!isFinite
em umDate
vai pegar o fato de queDate
éInvalid Date
. Também digno de nota, meu contexto está dentro do Node.fonte
você pode verificar o formato válido de txDate.value com este escopo. se estiver em um formato incorreto, a data não será executada e retornará nulo para dt.
E como o @ MiF sugeriu de maneira curta
fonte
Eu uso o código a seguir para validar valores para ano, mês e data.
Para detalhes, consulte Verificar data em javascript
fonte
str
não está sendo usado.Muitas respostas complicadas aqui já, mas uma linha simples é suficiente (ES5):
ou mesmo no ES6:
fonte
Date.parse(true)
, eu recebo corretamente um NaN.Vi algumas respostas que chegaram bem perto desse pequeno trecho.
Maneira JavaScript:
Maneira TypeScript:
fonte
Ótima solução! Incluído na minha biblioteca de funções auxiliares, agora fica assim:
fonte
Isso só funcionou para mim
No entanto, isso não funcionou
fonte
`${new Date('foo')}` === 'Invalid Date'
Para projetos Angular.js, você pode usar:
fonte
Nenhuma dessas respostas funcionou para mim (testada no Safari 6.0) ao tentar validar uma data como 31/2/2012, no entanto, elas funcionam bem ao tentar qualquer data maior que 31.
Então eu tive que usar força bruta um pouco. Supondo que a data esteja no formato
mm/dd/yyyy
. Estou usando a resposta @broox:fonte
&& value.split('/')[0] == (d.getMonth()+1);
new Date('string date')
é equivalente aDate.parse('string date')
, consulte: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…, para que você possa obter valores falsos verdadeiros ou falsos.Nenhuma das soluções acima funcionou para mim, mas o que funcionou é
o código acima verá quando JS faz 31/02/2012 em 02/02/2012 que não é válido
fonte
fonte
Eu escrevi essa função. Passe um parâmetro string e ele determinará se é uma data válida ou não com base neste formato "dd / MM / aaaa".
aqui está um teste
entrada: "hahaha", saída: false.
entrada: "29/2/2000", saída: true.
entrada: "29/2/2001", saída: false.
fonte
Date.prototype.toISOString
lançaRangeError
(pelo menos no Chromium e Firefox) em datas inválidas. Você pode usá-lo como um meio de validação e pode não ser necessárioisValidDate
(EAFP). Caso contrário, é:fonte
Inspirado pela abordagem de Borgar, assegurei-me de que o código não apenas validasse a data, mas também de que a data fosse real, o que significa que datas como 31/09/2011 e 29/02/2011 não são permitidas.
fonte
dd/MM/yyyy
notação. Além disso, ele retornatrue
quando é válido e,'Invalid date!'
se não for, é melhor retornar apenas um tipo.Combinei os melhores resultados de desempenho encontrados em torno dessa verificação se um determinado objeto:
O resultado é o seguinte:
fonte
O objeto Date para String é uma maneira mais simples e confiável de detectar se os dois campos são data válida. Por exemplo, se você digitar "-------" no campo de entrada da data. Algumas das respostas acima não funcionarão.
fonte
A resposta selecionada é excelente, e eu estou usando também. No entanto, se você estiver procurando uma maneira de validar a entrada de data do usuário, lembre-se de que o objeto Date é muito persistente ao transformar argumentos de construção inválidos em argumentos válidos. O seguinte código de teste de unidade ilustra o ponto:
fonte
Chame assim
fonte
Uma função pronta com base na resposta mais votada:
fonte
Solução simples e elegante:
fontes:
[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c
[2] Data incorreta mostrada na nova Data () em JavaScript
fonte
date.getDate() == day
é insuficiente para determinar se a data é válida. O formato da data original retornará uma data inválida em algumas implementações, independentemente de a data ser válida ou não. Também "1970-01-01 00:00", se analisado corretamente, retornará falso (ou seja,Boolean(+new Date("1970-01-01"))
retorna falso).const date = new Date(year, month, day);
Observe que o mês é 0 indexado dessa maneira, portanto, pode ser necessário subtrair um para alinhá-lo corretamente.Eu acho que parte disso é um processo longo. Podemos abreviá-lo, como mostrado abaixo:
fonte
Para componentes baseados em int 1 de uma data:
Testes:
fonte