Question Détection d'une instance de date "date invalide" en JavaScript


J'aimerais faire la différence entre les objets de date valides et non valides dans JS, mais je n'ai pas pu comprendre comment:

var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'

Des idées pour écrire un isValidDate fonction?

  • Ash recommandé Date.parse pour analyser les chaînes de date, ce qui permet de vérifier si la chaîne de date est valide.
  • Ce que je préférerais, si possible, c'est que mon API accepte une instance de Date et puisse vérifier / affirmer si elle est valide ou non. La solution de Borgar fait cela, mais j'ai besoin de le tester sur plusieurs navigateurs. Je me demande aussi s'il y a une manière plus élégante.
  • Ash m'a fait penser à ne pas avoir mon API accepter Date Dans tous les cas, cela serait plus facile à valider.
  • Borgar a suggéré de tester un Date instance, puis tester pour la DateLa valeur du temps. Si la date n'est pas valide, la valeur de l'heure est NaN. J'ai vérifié avec ECMA-262 et ce comportement est dans la norme, ce qui est exactement ce que je cherche.

1081
2017-08-30 11:34


origine


Réponses:


Voici comment je le ferais:

if (Object.prototype.toString.call(d) === "[object Date]") {
  // it is a date
  if (isNaN(d.getTime())) {  // d.valueOf() could also work
    // date is not valid
  } else {
    // date is valid
  }
} else {
  // not a date
}

Mise à jour [2018-05-31]: Si vous n'êtes pas concerné par les objets Date d'autres contextes JS (fenêtres, cadres ou iframes externes), cette forme plus simple peut être préférée:

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}

885
2017-08-30 11:48



À la place d'utiliser new Date() Tu devrais utiliser:

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse() renvoie un horodatage, un entier représentant le nombre de millisecondes écoulées depuis le 1er janvier 1970. Il reviendra NaN s'il ne peut pas analyser la chaîne de date fournie.


210
2017-08-30 11:47



Vous pouvez vérifier la validité d'un Date objet d via

d instanceof Date && isFinite(d)

Pour éviter les problèmes inter-cadres, on pourrait remplacer instanceof vérifier avec

Object.prototype.toString.call(d) === '[object Date]'

Un appel à getTime() un péché La réponse de Borgar est inutile isNaN() et isFinite() les deux convertissent implicitement en nombre.


88
2017-08-30 14:07



Ma solution consiste simplement à vérifier si vous avez un objet date valide:

la mise en oeuvre

Date.prototype.isValid = function () {
    // An invalid date object returns NaN for getTime() and NaN is the only
    // object not strictly equal to itself.
    return this.getTime() === this.getTime();
};  

Usage

var d = new Date("lol");

console.log(d.isValid()); // false

d = new Date("2012/09/11");

console.log(d.isValid()); // true

66
2017-09-11 15:03



Réponse la plus courte pour vérifier la date de validité

if(!isNaN(date.getTime()))

49
2017-07-04 10:10



Vous pouvez simplement utiliser moment.js

Voici un exemple:

var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false

le section de validation dans la documentation est assez clair.

De plus, les indicateurs d'analyse suivants entraînent une date non valide:

  • overflow: Un débordement d'un champ de date, tel qu'un 13ème mois, un 32ème jour du mois (ou un 29 février sur les années non bissextiles), un 367ème jour de l'année, etc. débordement contient l'index de l'unité invalide pour correspondre à #invalidAt (voir ci-dessous); -1 signifie pas de débordement.
  • invalidMonth: Un nom de mois non valide, tel que moment ('Mar février', 'MMMM') ;. Contient la chaîne de mois invalide elle-même, ou bien null.
  • empty: Une chaîne d'entrée qui ne contient rien de parable, comme moment ('ceci est un non-sens'). Booléen
  • Etc.

La source: http://momentjs.com/docs/


35
2017-10-14 20:18



Je voudrais mentionner que le widget DatePicker de l'interface utilisateur jQuery a une très bonne méthode d'utilitaire de validation de date qui vérifie le format et la validité (par exemple, pas de dates 01/33/2013 autorisées).

Même si vous ne souhaitez pas utiliser le widget datepicker sur votre page en tant qu'élément d'interface utilisateur, vous pouvez toujours ajouter sa bibliothèque .js à votre page, puis appeler la méthode validator en lui transmettant la valeur que vous souhaitez valider. Pour rendre la vie encore plus facile, il faut une chaîne en entrée, pas un objet JavaScript Date.

Voir: http://api.jqueryui.com/datepicker/

Ce n'est pas répertorié comme une méthode, mais il est là - comme une fonction d'utilité. Recherchez la page "parsedate" et vous trouverez:

$ .datepicker.parseDate (format, valeur, paramètres) - Extrait une date d'une valeur de chaîne avec un format spécifié.

Exemple d'utilisation:

var stringval = '01/03/2012';
var testdate;

try {
  testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
             // Notice 'yy' indicates a 4-digit year value
} catch (e)
{
 alert(stringval + ' is not valid.  Format must be MM/DD/YYYY ' +
       'and the date value must be valid for the calendar.';
}

(Plus d'informations sur la spécification des formats de date se trouve à http://api.jqueryui.com/datepicker/#utility-parseDate)

Dans l'exemple ci-dessus, le message d'alerte ne s'afficherait pas puisque '01 / 03/2012 'est une date valide au calendrier dans le format spécifié. Cependant si vous avez fait 'stringval' égal à '13 / 04/2013 ', par exemple, vous obtiendrez le message d'alerte, car la valeur '13 / 04/2013' n'est pas valide pour le calendrier.

Si une valeur de chaîne transmise est analysée avec succès, la valeur de 'testdate' sera un objet Date Javascript représentant la valeur de chaîne transmise. Sinon, ce serait indéfini.


35
2018-02-15 19:30