310 votes

Vérifier si une chaîne de caractères est une valeur de date

Quel est le moyen le plus simple de vérifier si une valeur est une date valide, tout format de date connu étant autorisé.

Par exemple, j'ai les valeurs suivantes 10-11-2009 , 10/11/2009 , 2009-11-10T07:00:00+0000 qui devraient toutes être reconnues comme des valeurs de date, et les valeurs 200 , 10 , 350 qui ne doit pas être reconnu comme une valeur de date. Quel est le moyen le plus simple de vérifier cela, si tant est que cela soit possible ? Parce que les timestamps seraient également autorisés.

5 votes

90voto

Neil Girardi Points 1059

Voici comment j'ai résolu ce problème dans une application sur laquelle je travaille actuellement :

mis à jour sur la base des commentaires de krillgar :

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}

8 votes

J'avais besoin de retourner (new Date(date)).toString() !== "Invalid Date" pour le nœud. Notez également que ? true : false est redondant. Renvoyer simplement l'expression sera suffisant ici.

1 votes

Dans IE8, new Date(date) ne vous donne pas le message "Invalid Date".

0 votes

@krillgar bien vu, je n'avais pas réalisé cela. Que vous donne IE 8 ? (Je n'ai pas encore configuré les VM Windows et IE sur mes ordinateurs portables Mac et Linux...)

66voto

Asmor Points 1693

Serait-ce Date.parse() suffisent ?

Voir son rapport Page de documentation MDN .

Date.parse renvoie un timestamp si la chaîne date est valide. Voici quelques cas d'utilisation :

// /!\ from now (2021) date interpretation changes a lot depending on the browser
Date.parse('01 Jan 1901 00:00:00 GMT') // -2177452800000
Date.parse('01/01/2012') // 1325372400000
Date.parse('153') // NaN (firefox) -57338928561000 (chrome)
Date.parse('string') // NaN
Date.parse(1) // NaN (firefox) 978303600000 (chrome)
Date.parse(1000) // -30610224000000 from 1000 it seems to be treated as year
Date.parse(1000, 12, 12) // -30610224000000 but days and month are not taken in account like in new Date(year, month,day...)
Date.parse(new Date(1970, 1, 0)) // 2588400000
// update with edge cases from comments
Date.parse('4.3') // NaN (firefox) 986248800000 (chrome)
Date.parse('2013-02-31') // NaN (firefox) 1362268800000 (chrome)
Date.parse("My Name 8") // NaN (firefox) 996616800000 (chrome)

49 votes

Soyez prudent avec ceci car il retournera toujours des dates invalides en février, par exemple : 2013-02-31

97 votes

Une autre raison de faire attention - les nombres sont assimilés à des dates. Date.parse("4.3") es 986270400000 .

4 votes

J'ai essayé de bricoler avec les deux cas de 'prudence' ci-dessus : console.log(Date.parse("2013-02-31")) ; console.log(Date.parse("4.3")) ; et dans les deux cas (sur firefox), cela a retourné NaN, donc pour moi, Date.parse semble OK (je vérifie les tirets et la longueur correcte avant l'analyse de toute façon).

36voto

krillgar Points 2791

new Date(date) === 'Invalid Date' ne fonctionne que dans Firefox et Chrome. IE8 (celui que j'ai sur ma machine à des fins de test) donne NaN.

Comme il a été dit à la réponse acceptée, Date.parse(date) fonctionnera également pour les chiffres. Pour contourner ce problème, vous pouvez donc également vérifier qu'il ne s'agit pas d'un nombre (si vous souhaitez le confirmer).

var parsedDate = Date.parse(date);

// You want to check again for !isNaN(parsedDate) here because Dates can be converted
// to numbers, but a failed Date parse will not.
if (isNaN(date) && !isNaN(parsedDate)) {
    /* do your work */
}

3 votes

Je réalise que c'est quelques années plus tard, mais isNan n'est pas une fonction ; cas incorrect en première instance.

3 votes

Ne fonctionne pas. Si date es Foostreet 1 votre condition est évaluée comme vraie.

1 votes

@FabianPicone - bien, techniquement, cela fonctionne, mais partage un défaut avec d'autres. parse -Les solutions basées sur la technologie : Date.parse("<text here> <number here>") est susceptible d'être analysée en une date "valide", ce qui provoque parsedDate à ne pas évaluer à NaN .

12voto

jwerre Points 1695

Que diriez-vous de quelque chose comme ça ? Il testera si c'est un objet Date ou une chaîne de date :

function isDate(value) {
    var dateFormat;
    if (toString.call(value) === '[object Date]') {
        return true;
    }
    if (typeof value.replace === 'function') {
        value.replace(/^\s+|\s+$/gm, '');
    }
    dateFormat = /(^\d{1,4}[\.|\\/|-]\d{1,2}[\.|\\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/;
    return dateFormat.test(value);
}

Je dois préciser que cela ne permet pas de tester les chaînes formatées ISO, mais avec un peu plus de travail sur la RegExp, tout devrait bien se passer.

1 votes

Cela ne permet pas de tester les chaînes de caractères qui ne sont pas des dates réelles, comme 2/31/2021.

0 votes

Ya, ce n'est probablement pas la meilleure façon de faire. Il serait très difficile de faire correspondre chaque combinaison possible de la chaîne de dates.

0 votes

Je vérifie que la chaîne est convertie en une date et que la date de la chaîne d'origine correspond à la date de la chaîne analysée afin de m'assurer qu'une date réelle est saisie. stackoverflow.com/a/66863366/7530620

0voto

Andrew Points 1

Ça marche :

var isDate = function(date) {
    return ((new Date(date)).toString() !== "Invalid Date") ? true : false;         
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X