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.

Ganesh
la source
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é.

Ganesh
la source
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.

schutta
la source
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());
});
gschambial
la source
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

wakeupoj
la source
12

Je viens de trouver une affaire vraiment foirée.

moment('Decimal128', 'YYYY-MM-DD').isValid() // true
Sam Araiza
la source
15
moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false. Utilisez le mode strict :) momentjs.com/guides/#/parsing/strict-mode
jklemmack
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.

tfmontague
la source
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
Sande
la source
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');
}
Tanzeem Bhatti
la source
-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
}
Pochen
la source
1
S'il vous plaît, ne faites pas ça.
tdelam le