2017-08-13 16 views
5

मुझे सर्वर से आने वाले समय को बदलने में कोई समस्या है और मैं इसे 24 घंटे में परिवर्तित करना चाहता हूं। मैं निम्नलिखित कोड का उपयोग कर रहा:12 (पीएम/एएम) घंटे अपराह्न में स्ट्रिंग कन्वर्ट करें 24 घंटे का समय एंड्रॉइड

Method threw 'java.text.ParseException' exception.)

विस्तृत त्रुटि संदेश है:

Unparseable date: "3:30 PM" (at offset 5)

लेकिन अगर मैं p.m. करने के लिए PM की जगह यह किसी भी बिना काम करता है

String timeComeFromServer = "3:30 PM"; 

SimpleDateFormat date12Format = new SimpleDateFormat("hh:mm a"); 

SimpleDateFormat date24Format = new SimpleDateFormat("HH:mm"); 
try { 
    ((TextView)findViewById(R.id.ahmad)).setText(date24Format.format(date12Format.parse(timeComeFromServer))); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

वहाँ त्रुटि है इस तरह की समस्या:

timeComeFromServer = timeComeFromServer.replaceAll("PM", "p.m.").replaceAll("AM", "a.m."); 

क्या कोई मुझे बता सकता है कि सही तरीका कौन सा है?

+0

मुझे त्रुटि मिली है यदि मैंने जे 7 सैमसंग का इस्तेमाल किया है तो पहले कोड पर काम नहीं करता है और यदि मैं काम करना चाहता हूं तो यह लाइन टाइमकॉमफ्रॉमसेवर = टाइम कॉमफ्रॉमसेवर.रेप्लेसएल ("पीएम", "अपराह्न") को प्रतिस्थापित करने के लिए जरूरी है। सभी ("एएम", "एम"); लेकिन अन्य डिवाइस बिना किसी रीप्ले के काम करते हैं – ahmad

उत्तर

1

SimpleDateFormat सिस्टम के डिफ़ॉल्ट स्थान (आप java.util.Locale वर्ग का उपयोग कर सकते हैं कि, Locale.getDefault() बुला) का उपयोग करता है। यह लोकेल डिवाइस/पर्यावरण विशिष्ट है, इसलिए आपके पास इसका कोई नियंत्रण नहीं है और प्रत्येक डिवाइस में अलग-अलग परिणाम हो सकते हैं।

और कुछ स्थानीय लोगों के पास AM/PM फ़ील्ड के लिए एक अलग प्रारूप हो सकता है। उदाहरण:

Date d = new Date(); 
System.out.println(new SimpleDateFormat("a", new Locale("es", "US")).format(d)); 
System.out.println(new SimpleDateFormat("a", Locale.ENGLISH).format(d)); 

उत्पादन होता है:

p.m.
PM

कि पर निर्भर नहीं करने के लिए, यदि आप अपने formatters में Locale.ENGLISH उपयोग कर सकते हैं ताकि आप प्रणाली/डिवाइस के डिफ़ॉल्ट विन्यास पर निर्भर नहीं होगा:

String timeComeFromServer = "3:30 PM"; 
// use English Locale 
SimpleDateFormat date12Format = new SimpleDateFormat("hh:mm a", Locale.ENGLISH); 
SimpleDateFormat date24Format = new SimpleDateFormat("HH:mm"); 
System.out.println(date24Format.format(date12Format.parse(timeComeFromServer))); 

उत्पादन होता है:

15:30

दूसरे फॉर्मेटर को एक विशिष्ट लोकेल की आवश्यकता नहीं है क्योंकि यह लोकेल विशिष्ट जानकारी से निपट नहीं रहा है।


जावा नई दिनांक/समय एपीआई

वर्ष वर्गों (Date, Calendar और SimpleDateFormat) lots of problems और design issues है, और वे नए एपीआई द्वारा प्रतिस्थापित किया जा रहे हैं।

एक विस्तार है कि SimpleDateFormat हमेशा Date वस्तुओं के साथ काम करता है जो पूर्ण टाइमस्टैम्प (1970-01-01T00:00Z के बाद मिलीसेकेंड की संख्या) है, और दोनों वर्गों implicity प्रणाली डिफ़ॉल्ट समय क्षेत्र behind the scenes है, जो आपको गुमराह करने और अप्रत्याशित और कठिन उत्पन्न कर सकते हैं का उपयोग करें परिणाम डीबग करने के लिए। लेकिन इस विशिष्ट मामले में, आपको केवल समय फ़ील्ड (घंटा और मिनट) की आवश्यकता है और टाइमस्टैम्प मानों के साथ काम करने की आवश्यकता नहीं है। नए एपीआई में प्रत्येक मामले के लिए विशिष्ट कक्षाएं होती हैं, बहुत बेहतर और कम त्रुटि प्रवण होती है।

एंड्रॉइड में आप ThreeTen Backport का उपयोग कर सकते हैं, जो जावा 8 की नई तिथि/समय कक्षाओं के लिए एक महान बैकपोर्ट है। इसे काम करने के लिए, आपको ThreeTenABP (here का उपयोग करने के तरीके के बारे में भी अधिक) की आवश्यकता होगी।

आप एक org.threeten.bp.format.DateTimeFormatter का उपयोग करें और के लिए इनपुट पार्स कर सकते हैं एक org.threeten.bp.LocalTime:

String timeComeFromServer = "3:30 PM"; 

DateTimeFormatter parser = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH); 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); 

LocalTime time = LocalTime.parse(timeComeFromServer, parser); 
System.out.println(time.format(formatter)); 

उत्पादन होता है:

15:30

इस विशेष मामले के लिए, आप भी time.toString() का उपयोग एक ही परिणाम प्राप्त करने के लिए कर सकता है । बैकपोर्ट एपीआई के बारे में अधिक जानकारी के लिए आप javadoc देख सकते हैं।

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