2012-05-17 11 views

Antwort

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

Verbrauch:

parse('20120401'); 

UPDATE:

als Raketen sagte Monaten sind in js-0 basiert ... verwenden diese Option, wenn Monat nicht 0-basierte in Ihre Zeichenkette

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

UPDATE:

Präzisere Überprüfung der Gültigkeit des Datums. Angenommen, HBP würde das Datum validieren.

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

Hinweis: In JavaScript sind die Monate nullindiziert. Sie sollten also 'new Date (y, m-1, d);' verwenden, andernfalls wird '20120401' angezeigt 1. Mai, nicht 1. April. –

+0

guten Punkt! ... Ich werde es nur bearbeiten. Vielen Dank! –

+0

Was ist, wenn der Eingang '00005050' ist? Es ist eine ungültige Zeichenfolge, aber 'neues Datum ('0000', '50', 50 ')' ist 'Di Jun 09 1903 00:00:00 GMT + 0300 (IDT)' – Michael

5

Eine robustere Version Validieren die Zahlen:

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

Siehe Geige an: http://jsfiddle.net/jstoolsmith/zJ7dM/

ich vor kurzem eine viel fähiger Version geschrieben finden Sie hier: http://jsfiddle.net/jstoolsmith/Db3JM/

+0

+1 für die Vereinfachung des Validierungsteils! –

+0

Großartig, aber anstatt * undefined * zurückzugeben, wo das Parsen fehlschlägt, sollte es ein ungültiges Datum zurückgeben, d. H. 'Neues Datum (NaN)'. – RobG

+0

Ersetzen Sie dazu das 'return undefined' durch' return date (NaN) ' – HBP

2

simpel antwort vielleicht, ohne checks, aber schnell ...

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

oder, falls Monate Null in der Quelle basiert,

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

HBP Antwort kombinieren und diese answer eine Funktion zu erhalten, die JJJJMMTThhmm parst und hier ist ein 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')); 
Verwandte Themen