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.