Vérifiez si la date est valide


124

Voici le scénario:

J'ai une Stringdate et un format de date différents. Ex .:
date: 2016-10-19
dateFormat: "JJ-MM-AAAA".

Je dois vérifier si cette date est une date valide.

J'ai essayé de suivre les choses

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

d.isValid()revient à falsechaque fois. Moment.js n'analyse-t-il pas la date dans le format donné?

Ensuite, j'ai essayé de formater la date en DD-MM-YYYYpremier, puis de la transmettre à Moment.js:

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

Cela date.isValid()me donne maintenant le résultat souhaité, mais ici l'objet de date Moment.js est créé deux fois. Comment puis-je éviter ça? Y a-t-il une meilleure solution?

Pour info, je ne suis pas autorisé à modifier le fichier dateFormat.


N'êtes-vous pas autorisé à modifier la valeur de dateFormat? Dans ce cas, vous devrez changer le format de l'entrée, puisque 2016-10-19 est AAAA-MM-JJ et non JJ-MM-AAAA. Que pouvez-vous changer?
Pochen

L'entrée provient du sélecteur de date. Je ne peux pas changer ça aussi :(
Ganesh

1
Puis-je vous demander pourquoi vous n'êtes pas autorisé à modifier la variable dateFormat? var d = moment ("19-10-2016", "JJ-MM-AAAA"); résoudrait vos problèmes en ce qui me concerne
Pochen

ne peut vraiment pas dire. Mais ce n'est pas sous mon contrôle de changer cette valeur.
Ganesh

Réponses:


185

A pu trouver la solution. Étant donné que la date que j'obtiens est au format ISO, seule la fourniture de date à moment la validera, pas besoin de passer le dateFormat.

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

Et date.isValid()donne ensuite le résultat souhaité.


15
Est-ce que quelqu'un sait quelle est la méthode préférée actuellement? Cette méthode lève maintenant l '«avertissement de dépréciation» suivant: la construction moment revient à js Date. Ceci est déconseillé et sera supprimé dans la prochaine version majeure. Veuillez consulter github.com/moment/moment/issues/1407 pour plus d'informations.
Andrew


4
Juste un avertissement que cela ne fonctionne pas toujours: var a = moment('12345'); a.isValid() // is truecela échoue car le moment reviendra à l'objet de date par défaut s'il ne peut pas analyser la date. Et l'objet de date par défaut renverra toujours une date (mais pas celle que vous voulez.)
Mauvis Ledford

1
besoin d'ajouter cela moment('02').isValid() === true, alors vous voudrez peut-être faire attention avec cela
Bruno Finger

3
Aussi moment('abcde 1').isValid() === true
Amiram Korach

119

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

Vous devez ajouter un troisième argument lors de l'appel momentqui impose une analyse stricte. Voici la partie pertinente de la documentation du moment http://momentjs.com/docs/#/parsing/string-format/ Elle se trouve vers la fin de la section.


Cela n'a aucun effet.
Billal Begueradj le

cette réponse devrait être la bonne réponse ........ @ Begueradj cela a un effet, essayez d'utiliser des valeurs différentes, parfois correctes et parfois erronées
Akki

Et vous pouvez lire sur l'analyse stricte ici
kuhr

Cela vous permettra d'entrer 0000 comme année
eddy

17

Ici vous allez: Working Fidddle

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});

Comme je l'ai dit, le dateFormat est «JJ-MM-AAAA» et je ne suis pas autorisé à le modifier.
Ganesh

Oh je vois. Laissez-moi voir à ce sujet.
gschambial

Est-il autorisé à modifier la chaîne de date ici 2016-10-19?
gschambial

Nan. Cela vient du sélecteur de dates
Ganesh

1
Ne pouvez-vous pas le modifier après qu'il provient de datepicker et avant de le saisir var d = moment("2016-10-19",dateFormat);?
gschambial

14

J'utilise moment avec new Date pour gérer les cas de undefinedvaleurs de données:

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

en raison de: moment(undefined).isValid() == true

où comme le meilleur moyen: moment(new Date(undefined)).isValid() == false



9

Comment vérifier si une chaîne est une date valide à l'aide de Moment, lorsque la date et le format de date sont différents

Désolé, mais l'une des solutions proposées sur ce fil de discussion a-t-elle réellement répondu à la question posée?

J'ai une date String et un format de date différent. Ex .: date: 2016-10-19 dateFormat: "JJ-MM-AAAA". Je dois vérifier si cette date est une date valide.

Ce qui suit fonctionne pour moi ...

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.

Mais honnêtement, je ne comprends pas pourquoi moment.isDate()( tel que documenté ) n'accepte qu'un objet. Devrait également supporter une chaîne à mon avis.


2
si nous passons true comme 3ème argument pour le moment, il vérifie le format de date exact.
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

pourriez-vous s'il vous plaît ajouter quelques explications à votre réponse? Quelle valeur supplémentaire cela ajoute-t-il à la réponse déjà existante et acceptée?
slfan

0

Si la date est valide, le getTime()sera toujours égal à lui-même.

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

-2

Essaye celui-là. Ce n'est pas sympa mais cela fonctionnera tant que l'entrée est au format constant de votre sélecteur de date.

C'est badDate provenant de votre sélecteur dans cet exemple

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
}

1
S'il vous plaît, ne faites pas ça.
tdelam le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.