2015-03-10 14 views
17

मुझे स्ट्रिंग से Durations पार्स करने की आवश्यकता है। जावा 8 एक आधार के रूप ISO-8601 मानक लेने कि लिए एक विधि प्रदान करते हैं:java.time में बग। अवधि

Duration.parse("p10d"); // parses as ten days 
Duration.parse("pt1h"); // parses as one hour 

मानक कहता है कि "यह आपसी सहमति से 'टी' चरित्र को छोड़ करने की अनुमति है" के रूप में Durations.parse() छुट्टी की जावाडोक के कुछ उदाहरण T बाहर। उनके मुताबिक, निम्नलिखित अभिव्यक्ति "-6 घंटे और +3 मिनट" के रूप में पार्स चाहिए:

"P-6H3M" 

लेकिन मैंने पाया कि सभी भाव T ommitting एक DateTimeParseException फेंक देते हैं। क्या यह parse() विधि में एक बग है या क्या मुझे कुछ याद आ रहा है?

+1

मुझे लगता है कि "आपसी समझौते" के बारे में उद्धरण केवल संयुक्त तिथि-समय प्रतिनिधित्व, नहीं अवधि प्रतिनिधित्व में "टी" को दर्शाता है। – RealSkeptic

उत्तर

16

में parse() की JavaDoc:

ASCII पत्र "टी" चाहिए,, पहली घटना से पहले होने अगर किसी भी एक घंटे, मिनट या दूसरा खंड के।

इसका मतलब है कि आप T शामिल करने की आवश्यकता है जब भी आप H, M, या S का उपयोग करें। हालांकि


उदाहरण गलत कर रहे हैं:

"P-6H3M" -- parses as "-6 hours and +3 minutes" 
"-P6H3M" -- parses as "-6 hours and -3 minutes" 
"-P-6H+3M" -- parses as "+6 hours and -3 minutes" 
+0

व्यक्तिगत रूप से मुझे विधि देखना अच्छा लगेगा 25 घंटे के लिए "p1d1h" जैसे तारों को स्वीकार करना (कोई 'टी') नहीं। कॉन्फ़िगरेशन फ़ाइलों में अवधि स्ट्रिंग पढ़ने के लिए बहुत आसान हो जाएगा (ई। जी। "1 डी 1 एच"): 'पी' तैयार करना आसान है, लेकिन स्ट्रिंग में कहीं भी 'टी' जोड़ना तुच्छ नहीं है। बस कल्पना करें कि विधि जावा में 9 सप्ताह और नैनोसेकंड स्वीकार करने लगती है। आपको 'टी' को स्ट्रिंग "1w1m1s1n" में कहां रखना होगा। – steffen

+1

@steffen 'T' का अर्थ है 'समय अनुभाग', इसलिए यह हमेशा 'एच' से पहले और' डी' के बाद होना चाहिए। –

+0

हां, लेकिन एच और डी दोनों को छोड़ा जा सकता है। – steffen

11

नियमित Duration.parse द्वारा प्रयोग किया जाता अभिव्यक्ति है:

private static final Pattern PATTERN = 
     Pattern.compile("([-+]?)P(?:([-+]?[0-9]+)D)?" + 
       "(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?", 
       Pattern.CASE_INSENSITIVE); 

इनपुट P-6H3M इस नियमित अभिव्यक्ति से मेल नहीं खाता। यह चौथी लाइन में

"(T?(?:([-+]?[ ... 

करने के लिए बदल जाता है (ध्यान दें T के बाद ?), उदाहरण मैच (http://regexpal.com/ पर उसकी जांच)।

तो ऐसा लगता है कि आपको कोड और जावाडोक के बीच असंगतता मिली है।

+1

यह एक बग क्यों है? सबसे पहले, मानक ओपी के संदर्भ में संदर्भ ओपी दिनांक + समय प्रतिनिधित्व से संबंधित है, अवधि प्रतिनिधित्व के लिए नहीं। दूसरा, पारस्परिक समझौते का अर्थ है कि जेडीके एक सहमत पार्टी नहीं होने का फैसला कर सकता है। – RealSkeptic

+0

आप पूरी तरह से सही हैं। मानक के बने ओपी की व्याख्या शायद गलत है। –

+0

रेगेक्स: http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/time/Duration.java#l151 – kervin

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