2015-10-23 13 views
6

में SimpleDateFormat व्यवहार परिवर्तन I Android 6.0, Marshmallow पर दिनांक स्वरूपण के साथ मुझे कोई समस्या आई है। नीचे उल्लिखित अपवाद फेंकने वाला कोड एक शुद्ध-जावा लाइब्रेरी है (अलग से बनाया गया) जो मेरा एप्लिकेशन API अनुरोधों ("क्लाइंट") के लिए उपयोग करता है। पुस्तकालय जावा 1.6 के साथ बनाया गया है यदि यह संबंधित है ... वैसे भी, कोड है;एंड्रॉइड मार्शमलो

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa", Locale.UK); 
Date eventDate = dateFormat.parse(StringUtils.substring(record, 0, 23).trim()); 

... record मूल्य है;

2015-10-23 Fri 10:59 PM BST 3.60 meters 

... जो "ट्रिमिंग" के बाद है;

2015-10-23 Fri 10:59 PM 
yyyy-MM-dd E hh:mm aa 

यह कोड फ्रायओ के अच्छे पुराने दिनों से काम करता है और यूनिट-परीक्षण है। मार्शमलो के अलावा सभी अपवाद फेंकता है;

10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: SynchroniseTidePosition.doInBackground 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: java.text.ParseException: Unparseable date: "2015-10-23 Fri 10:59 PM" (at offset 21) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.text.DateFormat.parse(DateFormat.java:579) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at com.oceanlife.rover.handler.XTideParser.parseResponse(XTideParser.java:69) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:107) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:43) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.lang.Thread.run(Thread.java:818) 

ऑफसेट "21" 10:59 में '9' के बाद की जगह है। क्या कोई इस विफलता को समझा सकता है?

अद्यतन

Joda समय पर स्विच और इसे बाहर थूक एक अधिक सूचनात्मक त्रुटि संदेश। यह रहा;

Invalid format ... is malformed at "PM" 

... हां, तो इस स्ट्रिंग की कोशिश कर के AM/PM पहलू पार्स किया जा सकता के बारे में है - the docs

+0

अंधेरे में गोली मार दी: क्या आप पुष्टि कर सकते हैं कि आपके तार कुछ यूटीएफ -8/यूटीएफ -16 एन्कोडिंग में नहीं हैं। –

+0

हाय @ मॉरिसन चांग - स्ट्रिंग्स को तारसेट के साथ पार्स किया जाता है; Charset.forName ("यूटीएफ -8") क्या सोच रहा है? – OceanLife

+0

क्षमा करें बस विचारों को फेंक दें। इसे मिला: http://stackoverflow.com/questions/24399846/android-simpledateformat-parsing-error (लेकिन पूर्व इकाई परीक्षण सफलता की व्याख्या नहीं करेगा) और यह: https://code.google.com/p/android/मुद्दों/विस्तार? id = 158,265। यदि ऐसा है तो क्षमा करने की तुलना में फिर से अधिक शोर हो सकता है। –

उत्तर

12

ब्रिटेन लोकेल के लिए वापस प्रतीत होता है "बजे" और "की अपनी परिभाषा के पड़ा है अपराह्न "बदल गया।

मार्शमलो में यूके लोकेल अब "एएम" के रूप में प्रतिनिधित्व किया गया है "एएम" और "पीएम" द्वारा "पीएम"

String record = "2015-10-23 Fri 10:59 p.m. BST 3.60 meters" 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa", Locale.UK); 

// note the length is 25 now, not 23... 
Date eventDate = dateFormat.parse(StringUtils.substring(record, 0, 25).trim()); 

मैं क्यों एक विवरण प्रदान नहीं कर सकते, लेकिन अमेरिका लोकेल AM/PM और a.m./p.m के साथ ब्रिटेन के साथ काम करता है।

संपादित

ऐसा प्रतीत होता है मार्च 2015 में लोकेल अपडेट के भाग के रूप, en_gb स्थान इसकी AM/PM परिभाषाओं की जगह थी। source diff

+0

इसके लिए धन्यवाद। मैं परीक्षण के लिए अमेरिकी लोकेल में स्विच करने के लिए कल रात से अपने परिवर्तनों को वापस कर रहा हूं। – OceanLife

+1

यह तय है! धन्यवाद - टिक और एक +1। बहुत यकीन है कि यह एक लोकप्रिय जवाब होने जा रहा है क्योंकि ऐप्स को मार्शमलो का समर्थन करने के लिए अपडेट किया गया है। बहुत बढ़िया। अब रनटाइम अनुमतियों पर! – OceanLife

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