2012-05-17 20 views

Respuesta

23
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); 
} 

Uso:

parse('20120401'); 

ACTUALIZACIÓN:

Como dijo Rocket, meses se basan en 0-js ... usar esto si el mes de no-0 basan en su cadena

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); 
} 

ACTUALIZACIÓN:

Comprobación más rigurosa para la validez de la fecha. Se adoptó la forma de HBP de validar la fecha.

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'; 
} 
+2

Nota: en JavaScript, los meses tienen índice cero, por lo que es posible que desee utilizar 'new Date (y, m-1, d);', de lo contrario '20120401' será 1 de mayo, no 1 de abril. –

+0

¡buen punto! ... lo editaré. ¡Gracias! –

+0

¿Qué sucede si la entrada es '00005050'? Es una cadena inválida, pero 'nueva Fecha ('0000', '50', 50 ')' es 'Tue Jun 09 1903 00:00:00 GMT + 0300 (IDT)' – Michael

5

A más robusta versión validar los números:

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; 
} 

Ver violín en: http://jsfiddle.net/jstoolsmith/zJ7dM/

Hace poco escribí una versión mucho más capaz que puede encontrar aquí: http://jsfiddle.net/jstoolsmith/Db3JM/

+0

+1 para simplificar la parte de validación –

+0

Genial, pero en lugar de devolver * undefined * donde falla el análisis, debería devolver una fecha no válida, es decir, 'new Date (NaN)'. – RobG

+0

Para hacer esto, reemplace el 'return undefined' con' return date (NaN) ' – HBP

2

simplista respuesta tal vez, sin controles, pero rápido ...

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

o, si mes no son cero basado en la fuente,

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

combinando la respuesta de la presión arterial alta y esto answer para obtener una función que analiza YYYYMMDDhhmm y aquí es una fiddle

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')); 
Cuestiones relacionadas