Verifique se a data é válida

124

A seguir está o cenário:

Eu tenho uma Stringdata e um formato de data diferentes. Ex .
: data:
19/10/2016 dataFormato: "DD-MM-AAAA".

Preciso verificar se esta data é válida.

Eu tentei seguir as coisas

var d = moment("2016-10-19",dateFormat);

d.isValid()está voltando falsesempre. Moment.js não analisa a data no formato fornecido?

Então tentei formatar a data DD-MM-YYYYprimeiro e depois passá-la para Moment.js:

var d = moment("2016-10-19").format(dateFormat);
var date = moment(d, dateFormat);

Agora date.isValid()está me dando o resultado desejado, mas aqui o objeto de data Moment.js é criado duas vezes. Como posso evitar isso? Existe uma solução melhor?

Para sua informação, não estou autorizado a alterar o dateFormat.

Ganesh
fonte
Você não tem permissão para alterar o valor de dateFormat? Nesse caso, você precisará alterar o formato da entrada, pois 19/10/2016 é AAAA-MM-DD, não DD-MM-AAAA. O que você pode mudar?
Pochen
A entrada é proveniente do seletor de datas. Não é possível alterar isso também :(
Ganesh
1
Posso perguntar por que você não tem permissão para alterar a variável dateFormat? var d = momento ("19-10-2016", "DD-MM-AAAA"); iria resolver os seus problemas, tanto quanto eu estou preocupado
Pochen
realmente não posso dizer. Mas isso não está no meu controle para alterar esse valor.
Ganesh

Respostas:

185

Conseguiu encontrar a solução. Como a data que estou obtendo está no formato ISO, apenas o fornecimento de data para momento o validará, não sendo necessário passar o dateFormat.

var date = moment("2016-10-19");

E então date.isValid()dá o resultado desejado.

Ganesh
fonte
15
Alguém sabe qual é o método preferido atual agora? Este método agora lança o seguinte "Aviso de reprovação": a construção do momento volta para js Date. Isso é desencorajado e será removido no próximo grande lançamento. Consulte github.com/moment/moment/issues/1407 para obter mais informações.
Andrew
4
Apenas lembre-se de que isso nem sempre funciona: var a = moment('12345'); a.isValid() // is trueisso falha porque o momento retornará ao objeto de data padrão se não puder analisar a data. E o objeto data padrão sempre retornará uma data (não apenas o que você quer.)
Mauvis Ledford
1
necessidade de acrescentar que moment('02').isValid() === true, de modo que você pode querer ter cuidado com isso
de Bruno Dedo
3
Tambémmoment('abcde 1').isValid() === true
Amiram Korach
119

var date = moment('2016-10-19', 'DD-MM-YYYY', true);

Você deve adicionar um terceiro argumento ao invocar momentque impõe uma análise estrita. Aqui está a parte relevante do momento em que a documentação está http://momentjs.com/docs/#/parsing/string-format/ Está perto do final da seção.

schutta
fonte
Isso não tem efeito.
Billal Begueradj
esta resposta deve ser a resposta correta ........ @ Begueradj isso tem efeito, tente usar valores diferentes, às vezes corretos e às vezes errados
Akki
E você pode ler sobre análise rigorosa aqui
kuhr
Isso permitirá que você digite 0000 como um ano
Eddy
17

Aqui está: Working Fidddle

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});
gschambial
fonte
Como eu disse, o dateFormat é 'DD-MM-YYYY' e não tenho permissão para alterá-lo.
Ganesh
Ah eu vejo. Deixe-me ver sobre isso.
gschambial
É permitido alterar a sequência de datas aqui 2016-10-19?
precisa
Não. Que é proveniente de selecionador de data
Ganesh
1
Você não pode modificá-lo depois que vem do datepicker e antes de inseri-lo var d = moment("2016-10-19",dateFormat);?
gschambial
14

Eu uso o momento junto com a nova Data para lidar com casos de undefinedvalores de dados:

const date = moment(new Date("2016-10-19"));

por causa de: moment(undefined).isValid() == true

onde como a melhor maneira: moment(new Date(undefined)).isValid() == false

wakeupoj
fonte
11

Acabei de encontrar um caso realmente bagunçado.

moment('Decimal128', 'YYYY-MM-DD').isValid() // true
Sam Araiza
fonte
14
moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false. Use o modo estrito :) momentjs.com/guides/#/parsing/strict-mode
jklemmack
8

Como verificar se uma sequência de caracteres é uma data válida usando Moment, quando a data e o formato da data são diferentes

Desculpe, mas alguma das soluções fornecidas neste segmento realmente respondeu à pergunta que foi feita?

Eu tenho uma data String e um formato de data que é diferente. Ex .: data: 19/10/2016 dataFormato: "DD-MM-AAAA". Preciso verificar se esta data é válida.

O seguinte funciona para mim ...

const date = '2016-10-19';
const dateFormat = 'DD-MM-YYYY';
const toDateFormat = moment(new Date(date)).format(dateFormat);
moment(toDateFormat, dateFormat, true).isValid();

// Note: `new Date()` circumvents the warning that
// Moment throws (https://momentjs.com/guides/#/warnings/js-date/),
// but may not be optimal.

Mas, honestamente, não entenda por que moment.isDate()( conforme documentado ) aceita apenas um objeto. Também deve suportar uma string na minha opinião.

tfmontague
fonte
1
se passarmos verdadeiro como terceiro argumento por um momento, será verificado o formato exato da data.
Raj Kumar N
2
console.log(` moment('2019-09-01', 'YYYY-MM-DD').isValid()?  ` +moment('2019-09-01', 'YYYY-MM-DD').isValid())
console.log(` moment('2019-22-01', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-01', 'YYYY-DD-MM').isValid())
console.log(` moment('2019-22-22', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-22', 'YYYY-DD-MM').isValid())
console.log(` moment('undefined', 'YYYY-DD-MM').isValid()?  ` +moment('undefined', 'YYYY-DD-MM').isValid())

 moment('2019-09-01', 'YYYY-MM-DD').isValid()?  true
 moment('2019-22-01', 'YYYY-DD-MM').isValid()?  true
 moment('2019-22-22', 'YYYY-DD-MM').isValid()?  false
 moment('undefined', 'YYYY-DD-MM').isValid()?  false
Sande
fonte
você poderia adicionar alguma explicação à sua resposta? Que valor adicional isso acrescenta à resposta já existente e aceita?
slfan 21/05/19
0

Se a data for válida, getTime()sempre será igual a si mesma.

var date = new Date('2019-12-12');
if(date.getTime() - date.getTime() === 0) {
    console.log('Date is valid');
} else {
    console.log('Date is invalid');
}
Tanzeem Bhatti
fonte
-2

Tente este. Não é legal, mas funcionará desde que a entrada seja um formato constante do seu seletor de datas.

É badDate vindo do seu selecionador neste exemplo

https://jsfiddle.net/xs8tvox9/

var dateFormat = 'DD-MM-YYYY'
var badDate = "2016-10-19";

var splittedDate = badDate.split('-');

if (splittedDate.length == 3) {
  var d = moment(splittedDate[2]+"-"+splittedDate[1]+"-"+splittedDate[0], dateFormat);
  alert(d.isValid())
} else {
  //incorrectFormat
}
Pochen
fonte
1
Por favor, não faça isso.
tdelam 17/01