2012-05-17 37 views

Trả lời

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

Cách sử dụng:

parse('20120401'); 

UPDATE:

Như Rocket nói, tháng được 0-có trụ sở tại js ... sử dụng này nếu tháng được không 0 dựa trên trong chuỗi của bạn

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

CẬP NHẬT:

Kiểm tra nghiêm ngặt hơn về tính hợp lệ của ngày. Thông qua cách của HBP để xác nhận ngày.

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

Lưu ý: trong JavaScript, tháng không được lập chỉ mục, vì vậy bạn có thể muốn sử dụng 'Ngày mới (y, m-1, d);', nếu không '20120401' sẽ là Ngày 1 tháng 5, không phải ngày 1 tháng 4. –

+0

điểm tốt! ... tôi sẽ chỉnh sửa nó. Cảm ơn! –

+0

Điều gì sẽ xảy ra nếu đầu vào là '00005050'? Nó là chuỗi không hợp lệ nhưng 'new Date ('0000', '50', 50 ')' là 'Tue Jun 09 1903 00:00:00 GMT + 0300 (IDT)' – Michael

5

Một hơn phiên bản mạnh mẽ xác nhận những con số:

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

Xem fiddle tại địa chỉ: http://jsfiddle.net/jstoolsmith/zJ7dM/

Gần đây tôi đã viết một phiên bản nhiều khả năng hơn, bạn có thể tìm thấy ở đây: http://jsfiddle.net/jstoolsmith/Db3JM/

+0

+1 để đơn giản hóa phần xác thực! –

+0

Tuyệt vời, nhưng thay vì trả lại * không xác định * khi phân tích cú pháp không thành công, nó sẽ trả lại ngày không hợp lệ, tức là 'ngày mới (NaN)'. – RobG

+0

Để thực hiện việc này, hãy thay thế 'return undefined' bằng' return date (NaN) ' – HBP

2

đơn giản trả lời có thể, không có séc, nhưng nhanh chóng ...

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

hoặc, nếu tháng không phải là zero có trụ sở tại nguồn,

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

kết hợp câu trả lời của HBP và answer này để có được một hàm phân tích YYYYMMDDHHmm và đây là một 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')); 
Các vấn đề liên quan