2012-06-13 23 views
6

मुझे मिलीसेकंड में 98d 01h 23m 45s फॉर्म की अवधि स्ट्रिंग को पार्स करने की आवश्यकता है।मिलीसेकंड में पार्सिंग अवधि स्ट्रिंग

मुझे उम्मीद थी कि इस तरह की अवधि के लिए SimpleDateFormat के बराबर था, लेकिन मुझे कुछ भी नहीं मिला। क्या कोई इस उद्देश्य के लिए एसडीएफ का उपयोग करने की कोशिश कर रहा है या इसके खिलाफ सिफारिश करेगा?

मेरे वर्तमान योजना संख्या के खिलाफ मेल खाते हैं और इस तरह

Pattern p = Pattern.compile("(\\d+)"); 
Matcher m = p.matcher("98d 01h 23m 45s"); 

if (m.find()) { 
    int days = Integer.parseInt(m.group()); 
} 
// etc. for hours, minutes, seconds 

कुछ करना है और फिर TimeUnit का उपयोग यह सब एक साथ रखा और मिलीसेकेंड में कन्वर्ट करने के लिए regex का उपयोग करने के लिए है।

मुझे लगता है कि मेरा सवाल है, यह ओवरकिल जैसा लगता है, क्या यह आसान हो सकता है? तिथियों और टाइमस्टैम्प के बारे में बहुत सारे प्रश्न सामने आए लेकिन यह थोड़ा अलग है, शायद।

+1

आपका दृष्टिकोण अब तक ठीक दिखता है। हालांकि, Integer.parseInt() 'और अग्रणी शून्य के साथ सावधान रहें। कुछ ... '08h ...' की तरह ऑक्टल के रूप में व्याख्या की जाएगी और पार्स करने में असफल हो जाएगी। किसी भी अग्रणी शून्य से पट्टी। –

+0

@ फिलिप रिचर्ट यह सुरक्षित नहीं है जिस तरह से मैं इसे ऊपर उपयोग कर रहा हूं, क्योंकि 'Integer.parseInt ("08")' रिटर्न '8' है? – Craigy

+0

शायद प्रमुख रिक्त स्थान की आपकी सोच। 'System.out.println (" Integer.parseInt ("00 9")); मेरी मशीन पर 'प्रिंट "9"। 'H' को' parseInt' पर नहीं भेजा जाना चाहिए, हालांकि – Gene

उत्तर

5

Pattern का उपयोग करने का एक उचित तरीका है। लेकिन सभी चार क्षेत्रों को पाने के लिए एक का उपयोग क्यों नहीं करें?

Pattern p = Pattern.compile("(\\d+)d\\s+(\\d+)h\\s+(\\d+)m\\s+(\\d+)s"); 

फिर अनुक्रमित समूह लाने का उपयोग करें।

संपादित करें:

अपने विचार के बंद बिल्डिंग, मैं अंत में लिखा है निम्न विधि

private static Pattern p = Pattern 
     .compile("(\\d+)d\\s+(\\d+)h\\s+(\\d+)m\\s+(\\d+)s"); 

/** 
* Parses a duration string of the form "98d 01h 23m 45s" into milliseconds. 
* 
* @throws ParseException 
*/ 
public static long parseDuration(String duration) throws ParseException { 
    Matcher m = p.matcher(duration); 

    long milliseconds = 0; 

    if (m.find() && m.groupCount() == 4) { 
     int days = Integer.parseInt(m.group(1)); 
     milliseconds += TimeUnit.MILLISECONDS.convert(days, TimeUnit.DAYS); 
     int hours = Integer.parseInt(m.group(2)); 
     milliseconds += TimeUnit.MILLISECONDS 
       .convert(hours, TimeUnit.HOURS); 
     int minutes = Integer.parseInt(m.group(3)); 
     milliseconds += TimeUnit.MILLISECONDS.convert(minutes, 
       TimeUnit.MINUTES); 
     int seconds = Integer.parseInt(m.group(4)); 
     milliseconds += TimeUnit.MILLISECONDS.convert(seconds, 
       TimeUnit.SECONDS); 
    } else { 
     throw new ParseException("Cannot parse duration " + duration, 0); 
    } 

    return milliseconds; 
} 
11
बाहर

चेक PeriodFormatter और PeriodParserJodaTime library से।

तुम भी PeriodFormatterBuilder उपयोग कर सकते हैं एक पार्सर, यह सब (विशेष रूप से toDurationFrom(...) भाग) इस

String periodString = "98d 01h 23m 45s"; 

PeriodParser parser = new PeriodFormatterBuilder() 
    .appendDays().appendSuffix("d ") 
    .appendHours().appendSuffix("h ") 
    .appendMinutes().appendSuffix("m ") 
    .appendSeconds().appendSuffix("s ") 
    .toParser(); 

MutablePeriod period = new MutablePeriod(); 
parser.parseInto(period, periodString, 0, Locale.getDefault()); 

long millis = period.toDurationFrom(new DateTime(0)).getMillis(); 

की तरह अपने स्ट्रिंग्स के लिए निर्माण करने के लिए अब मुश्किल लग सकता है, लेकिन मैं वास्तव में JodaTime में देखना आप सलाह यदि आप जावा में अवधि और अवधि के साथ काम कर रहे हैं।

अतिरिक्त स्पष्टीकरण के लिए at this answer about obtaining milliseconds from JodaTime period भी देखें।

+1

बहुत विस्तृत प्रतिक्रिया के लिए धन्यवाद! दुर्भाग्य से मैं एक का उपयोग करने जा रहा हूँ समाधान जो अतिरिक्त निर्भरताओं को जोड़ने की आवश्यकता नहीं है, लेकिन मुझे यकीन है कि कोई आपके कोड का उपयोग करेगा। – Craigy

+0

मेरे पास है! धन्यवाद! – Tom

4

जावा 8 आइए में नए java.time.Duration वर्ग आप बॉक्स से बाहर अवधियों पार्स:

Duration.parse("P98DT01H23M45S").toMillis(); 

प्रारूप थोड़ा अलग है इसलिए पार्सिंग से पहले समायोजन की आवश्यकता होगी।

+0

मैं पार्सिंग के लिए एक नया SO प्रश्न पोस्ट करने वाला था "00:07:21।5 9 58786 "और एक पूर्णांक (मिलिस या नैनो में) लौट रहा है। धन्यवाद! वैसे, दस्तावेज़ीकरण चले गए, इसलिए यह ध्यान देने योग्य है कि आप जावा.टाइम की सिफारिश करते हैं। अवधि, अन्य अवधि कक्षाओं नहीं। – Daniel

+0

धन्यवाद, निश्चित टूटी हुई लिंक – Andrejs

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