2015-01-09 7 views
16

मेरे पास एक आईएसओ 8601 स्वरूपित अवधि है, उदाहरण के लिए: पीटी 5 एम या पीटी 120 एस।पल.जेएस का उपयोग करके मैं एक आईएसओ 8601 प्रारूपित अवधि का विश्लेषण कैसे करूं?

क्या कोई तरीका है कि मैं moment.js का उपयोग करके इन्हें पार्स कर सकता हूं और अवधि में निर्दिष्ट मिनटों की संख्या प्राप्त कर सकता हूं?

धन्यवाद!

पुनश्च: मैं Parse ISO 8601 durations और Convert ISO 8601 time format into normal time duration

को देखा लेकिन अगर यह था करने योग्य पल के साथ पता करने के लिए उत्सुक था।

+0

क्या आपने उनके दस्तावेज़ों की जांच की? मुझे वहाँ ISO8601 अवधि पार्सिंग नहीं दिखाई दे रही है http://momentjs.com/docs/#/parsing/ – Xotic750

उत्तर

23

पल के बाद parse ISO-formatted durations करता है के साथ बॉक्स से बाहर moment.duration विधि:

moment.duration('P1Y2M3DT4H5M6S') 

regex is gnarly, लेकिन कई किनारे के मामलों का समर्थन करता है और बहुत अच्छी तरह से tested है।

+1

यह वास्तव में करता है। दस्तावेज़ों में उल्लिखित एकमात्र चीज 'अवधि है .toJSON()' आईएसओ प्रारूप देता है, लेकिन यह दोनों दिशाओं में काम करता है। – smhg

+0

इसके अतिरिक्त, 'अवधि .toString()' और 'अवधि .toISOString()' आईएसओ प्रारूप भी वापस। – smhg

+0

यह शीर्ष जवाब होना चाहिए! एक विश्वसनीय पुस्तकालय पहले से ही करता है जब regex के साथ गड़बड़ क्यों। – adrianmc

5

यह समर्थित स्वरूपों में से एक होने के लिए यह मौजूद नहीं था: http://momentjs.com/docs/#/durations/

वहाँ GitHub रेपोस कि यह regex के साथ हल के किसी भी कमी नहीं हैं (जैसा कि आप देखा है, लिंक आपके द्वारा दी गई पर आधारित)। यह तारीख का उपयोग किए बिना हल करता है। क्या पल की भी आवश्यकता है?

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

आप इसे परीक्षण हैं:

minutesFromIsoDuration ("PT120S");

minutesFromIsoDuration ("PT5M");

आप मिनटों में तार्किक अवधि चाहते हैं, आप के साथ भाग मिल सकता है:

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

result.as("minutes"); 
+0

धन्यवाद मार्क! लेकिन मैं 'PT120S' को' 2' (2 मिनट) के रूप में पढ़ने की उम्मीद कर रहा था। मैं आदिम मार्ग ले रहा हूं, 'पीटी' को अलग कर रहा हूं और तदनुसार मिनटों की गणना कर रहा हूं। – Qrious

+0

इतने सारे संशोधन के लिए खेद है - आशा है कि आपको स्पैमड नहीं मिल रहा है –

+1

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

संबंधित मुद्दे