web-dev-qa-db-fra.com

Momentjs: Comment empêcher une "date invalide"?

J'ai le code suivant :

var fomattedDate = moment(myDate).format("L");

Parfois, moment(myDate).format("L") renvoie "Date invalide", je veux savoir s'il existe un moyen d'empêcher cela et de renvoyer une chaîne vide à la place.

19
R3tep

TL; DR

Si votre objectif est de savoir si vous avez une date valide, utilisez isValid de Moment:

var end_date_moment, end_date;
jsonNC.end_date = jsonNC.end_date.replace(" ", "T");
end_date_moment = moment(jsonNC.end_date);
end_date = end_date_moment.isValid() ? end_date_moment.format("L") : "";

... qui utilisera "" pour la chaîne end_date si la date n'est pas valide.

Détails

Il se passe deux choses très différentes ici.

Premier:

0000-00-00T00:00:00est une date invalide. Il n'y a pas de mois avant janvier (qui est le mois # 1 dans ce format), ni un jour de mois avant le jour # 1. 0000-00-00 N'a donc aucun sens.

0000-01-01T00:00:00 Serait valide - et moment("0000-01-01T00:00:00").format("L") renvoie heureusement "01/01/0000" Pour cela.

Si vous utilisez une date valide (comme votre exemple 2015-01-01T00:00:00), Le code est correct.

Seconde:

console.log(Object.prototype.toString.call(end_date));

Il retourne [chaîne d'objet] même avec une date valide, donc la condition if ne fonctionne pas dans mon cas.

Bien sûr, c'est le cas: format renvoie une chaîne et vous utilisez format pour obtenir end_date.

Si vous voulez savoir si un objet MomentJS a une date non valide, vous pouvez vérifier comme ceci:

if (theMomentObject.isValid()) {
    // It has as valid date
} else {
    // It doesn't
}

Si vous voulez savoir si un objet Date a une date invalide:

if (!isNaN(theDateObject)) {
    // It has as valid date
} else {
    // It doesn't
}

... parce que isNaN contraindra la date à sa forme primitive, qui est le nombre de millisecondes sous-jacent depuis le 1er janvier 1970 00:00:00 GMT, et lorsqu'une date a une date "invalide", le nombre il contient est NaN. Donc isNaN(theDateObject) est vrai lorsque la date n'est pas valide.

26
T.J. Crowder