web-dev-qa-db-fra.com

Comment analyser une date au format "YYYYmmdd" en JavaScript?

C'est une question de noob:

Comment analyser une date au format "YYYYmmdd" sans bibliothèques externes? Si la chaîne d'entrée n'est pas dans ce format, j'aimerais obtenir invalid Date (ou undefined si ce sera plus facile).

15
Michael
function parse(str) {
    if(!/^(\d){8}$/.test(str)) return "invalid date";
    var y = str.substr(0,4),
        m = str.substr(4,2),
        d = str.substr(6,2);
    return new Date(y,m,d);
}

Usage:

parse('20120401');

METTRE À JOUR:

Comme Rocket l'a dit, les mois sont basés sur 0 dans js ... utilisez ceci si les mois ne sont pas basés sur 0 dans votre chaîne

function parse(str) {
    if(!/^(\d){8}$/.test(str)) return "invalid date";
    var y = str.substr(0,4),
        m = str.substr(4,2) - 1,
        d = str.substr(6,2);
    return new Date(y,m,d);
}

METTRE À JOUR:

Vérification plus rigoureuse de la validité de la date. Façon adoptée par le RAP pour valider la date.

function parse(str) {
    var y = str.substr(0,4),
        m = str.substr(4,2) - 1,
        d = str.substr(6,2);
    var D = new Date(y,m,d);
    return (D.getFullYear() == y && D.getMonth() == m && D.getDate() == d) ? D : 'invalid date';
}
26
Parth Thakkar

Une version plus robuste validant les chiffres:

 function parse (str) {
        // validate year as 4 digits, month as 01-12, and day as 01-31 
        if ((str = str.match (/^(\d{4})(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])$/))) {
           // make a date
           str[0] = new Date (+str[1], +str[2] - 1, +str[3]);
           // check if month stayed the same (ie that day number is valid)
           if (str[0].getMonth () === +str[2] - 1)
              return str[0];
        }
        return undefined;
 }

Voir le violon à l’adresse: http://jsfiddle.net/jstoolsmith/zJ7dM/

J'ai récemment écrit une version beaucoup plus performante que vous pouvez trouver ici: http://jsfiddle.net/jstoolsmith/Db3JM/

5
HBP

réponse simpliste peut-être, sans contrôles, mais rapide ...

var date = parseInt(date);
new Date(date / 10000, date % 10000 / 100, date % 100);

ou, si les mois ne sont pas nuls dans la source,

new Date(date / 10000, (date % 10000 / 100) - 1, date % 100);
4
MrE

combinant la réponse de HBP et cette answer pour obtenir une fonction qui analyse YYYYMMDDHHmm et voici un violon

var parseTS=function(str){
                // validate year as 4 digits, month as 01-12, and day as 01-31
                if ((str = str.match (/^(\d{4})(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])([0-5]\d)$/))) {
                    // make a date
                    str[0] = new Date (+str[1], +str[2] - 1, +str[3], +str[4], +str[5]);
                    // check if month stayed the same (ie that day number is valid)
                    if (str[0].getMonth () === +str[2] - 1) {
                        return str[0];
                    }
                }
                return undefined;
            };

    console.log(parseTS('201501012645'));
0
Or Gal