2015-01-09 11 views
16

Tôi có thời hạn định dạng ISO 8601, ví dụ: PT5M hoặc PT120S.Làm cách nào để phân tích cú pháp thời gian định dạng ISO 8601 bằng cách sử dụng moment.js?

Có cách nào tôi có thể phân tích cú pháp này bằng cách sử dụng moment.js và tìm nạp số phút được chỉ định trong thời lượng không?

Cảm ơn bạn!

PS: Tôi nhìn Parse ISO 8601 durationsConvert ISO 8601 time format into normal time duration

nhưng đã được quan tâm để biết nếu điều này là không-thể với khoảnh khắc.

+0

Bạn đã kiểm tra tài liệu của họ chưa? Tôi không thấy phân tích cú pháp thời gian ISO8601 ở đó http://momentjs.com/docs/#/parsing/ – Xotic750

Trả lời

23

khoảnh khắc khôngparse ISO-formatted durations out of the box với phương thức moment.duration:

moment.duration('P1Y2M3DT4H5M6S') 

regex is gnarly, nhưng hỗ trợ một số trường hợp cạnh và khá kỹ lưỡng tested.

+1

Thực sự là vậy. Điều duy nhất được đề cập trong tài liệu là 'duration.toJSON()' trả về định dạng ISO, nhưng nó hoạt động theo cả hai hướng. – smhg

+0

Ngoài ra, 'duration.toString()' và 'duration.toISOString()' cũng trả về định dạng ISO. – smhg

+0

Đây sẽ là câu trả lời hàng đầu! Tại sao lộn xộn với regex khi một thư viện đáng tin cậy đã làm nó. – adrianmc

5

Nó không xuất hiện là một trong các định dạng được hỗ trợ: http://momentjs.com/docs/#/durations/

Có không có bất kỳ sự thiếu hụt của Repos github mà giải quyết nó với regex (như bạn đã thấy, dựa vào các liên kết mà bạn cung cấp). Điều này giải quyết nó mà không cần sử dụng Date. Thậm chí có cần chút thời gian không?

var regex = /P((([0-9]*\.?[0-9]*)Y)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)W)?(([0-9]*\.?[0-9]*)D)?)?(T(([0-9]*\.?[0-9]*)H)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)S)?)?/ 

minutesFromIsoDuration = function(duration) { 
    var matches = duration.match(regex); 

    return parseFloat(matches[14]) || 0; 
} 

Nếu bạn kiểm tra nó:

minutesFromIsoDuration ("PT120S");

phútFromIsoDuration ("PT5M");

Nếu bạn muốn thời gian hợp lý trong vài phút, bạn có thể nhận được ngay với:

return moment.duration({ 
    years: parseFloat(matches[3]), 
    months: parseFloat(matches[5]), 
    weeks: parseFloat(matches[7]), 
    days: parseFloat(matches[9]), 
    hours: parseFloat(matches[12]), 
    minutes: parseFloat(matches[14]), 
    seconds: parseFloat(matches[16]) 
}); 

Tiếp theo

result.as("minutes"); 
+0

Cảm ơn Mark! Nhưng tôi đã hy vọng có 'PT120S' được đọc là' 2' (2 phút). Tôi đang lấy con đường nguyên thủy, tước 'PT' và tính số phút tương ứng cho phù hợp. – Qrious

+0

Xin lỗi vì đã sửa đổi rất nhiều - hy vọng bạn không bị spam –

+1

http://jsfiddle.net/7cpf9hb5/ –

Các vấn đề liên quan