2010-01-25 12 views
9

मुझे जावा में एक कस्टम दिनांक प्रारूप का उपयोग करना है। इसमें माइक्रोसॉन्ड होते हैं हालांकि जावा माइक्रोसेकंड के लिए समर्थन प्रदान नहीं करता है। इसके कारण मैंने शून्य के साथ समय पैटर्न भर दिया, जो स्वरूपण करते समय ठीक काम करता है, लेकिन मैं उस पैटर्न के साथ दिनांक-तारों का विश्लेषण नहीं कर सकता।कस्टम दिनांक प्रारूप को पार्स नहीं किया जा सकता है। (जावा)

क्या कोई साधारण कामकाज है या क्या मुझे अपने आप माइक्रोक्रॉकों को स्ट्रिंग फ़ंक्शन के साथ संभालना चाहिए?

@Test 
public void testDateFormat() throws ParseException { 
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS000"); 
    String theDate = format.format(new Date()); 
    // this will fail: 
    format.parse(theDate); 
} 

java.text.ParseException: Unparseable तारीख: "2010-01-25-12.40.35.769000"

+0

एफवाईआई, परेशान पुराने दिनांक-समय के वर्ग जैसे ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) , ['java.util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html), और 'java.text.SimpleTextFormat' अब [विरासत ] (https://en.wikipedia.org/wiki/Legacy_system), [java.time] द्वारा आपूर्ति की गई (https://docs.oracle.com/javase/8/docs/api/java/time/package- summary.html) कक्षाएं। देखें [ओरेकल द्वारा ट्यूटोरियल] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html)। –

उत्तर

11

आपकी समस्या यह है कि सरलडेटाफॉर्मेट में प्रयुक्त पैटर्न दुर्भाग्यवश अलग-अलग अर्थों के आधार पर अलग-अलग अर्थों के आधार पर होता है कि इसका उपयोग पार्सर या फॉर्मेटर के रूप में किया जाता है या नहीं।

2010-01-25-14.17.47.307000

के रूप में प्रयुक्त: एक फ़ॉर्मेटर के रूप में, अपने पैटर्न क्या उम्मीद है, उत्पादन मिलीसेकंड मान तीन अंकों के रूप में स्वरूपित तीन 0 वर्ण के बाद, जैसे के साथ खत्म हो जाएगा करता है एक पार्सर, "एसएसएस" पैटर्न हालांकि अंकों की मनमानी संख्या से मेल खाता है और उपर्युक्त उदाहरण को 307000 एमएस के रूप में पार्स करेगा। एमएस क्षेत्र को पार्स करने के बाद, पार्सर अभी भी "000" सबस्ट्रिंग की तलाश करेगा और अपवाद के साथ असफल होगा, क्योंकि आप पैटर्न की आवश्यकताओं को पूरा किए बिना इनपुट स्ट्रिंग के अंत तक पहुंच गए हैं।

चूंकि SimpleDateFormat में μs मान के लिए कोई पैटर्न नहीं है, इसलिए आपको SimpleDateFormat को खिलाने से पहले, पिछले तीन 0 वर्णों के लिए इनपुट स्ट्रिंग को स्ट्रिप करने के लिए अपना स्वयं का रैपर लिखना होगा।

0

, एक '' शून्य के आसपास जोड़ें ताकि तरह: "yyyy-MM-dd-HH.mm.ss.SSS'000'"

दिनांक और समय प्रारूप दिनांक और समय पैटर्न स्ट्रिंग द्वारा निर्दिष्ट किए गए हैं। दिनांक और समय पैटर्न तारों के भीतर, 'ए' से 'ज़ेड' और से 'ए' से 'ज़ेड' तक अनगिनत अक्षरों को पैटर्न अक्षरों के रूप में व्याख्या किया गया है जो दिनांक या समय स्ट्रिंग के घटकों का प्रतिनिधित्व करते हैं। व्याख्या को टालने के लिए सिंगल कोट्स (') का उपयोग करके पाठ उद्धृत किया जा सकता है। "'' ' एक एकल उद्धरण का प्रतिनिधित्व करता है। अन्य सभी वर्णों का अर्थ नहीं लिया गया है; वे पार्सिंग के दौरान इनपुट स्ट्रिंग के विरुद्ध स्वरूपण के दौरान आउटपुट स्ट्रिंग में बस कॉपी किए गए हैं।

+5

एकल उद्धरण के साथ मेरा टेस्टकेस अभी भी एक पारसी अपवाद फेंकता है। –

+1

क्योंकि '000' 'ए' से 'ज़ेड' और 'ए' से 'z' तक अक्षर नहीं हैं। – Marboni

3

jarnbjo के जवाब के अलावा, यदि आप माइक्रोसेकंड की जरूरत है, आप का उपयोग करने में सक्षम हो सकता है java.sql.Timestamp:

Date dateToMillis = format.parse(theDate.substring(0, 23)); 
DateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
Timestamp timestamp = Timestamp.valueOf(timestampFormat.format(dateToMillis) + theDate.substring(23,26)); 
1

tl; डॉ

LocalDateTime.parse( 
    "2010-01-25-12.40.35.769000" , 
    DateTimeFormatter.ofPattern("uuuu-MM-dd-HH.mm.ss.SSSSSS") 
) 

java.time

का उपयोग करना

आप पुराने पुराने डेट-टाइम कक्षाओं का उपयोग कर रहे हैं जो अब विरासत हैं, जो जावा.टाइम कक्षाओं द्वारा आपूर्ति की जाती हैं।

ये पुरानी कक्षाएं milliseconds को ट्रैक करने के लिए सीमित थीं, दशमलव अंश के तीन अंक। आधुनिक जावानौ दशमलव अंश के अंक के लिए nanoseconds पर समय कक्षाएं हल करें।

DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd-HH.mm.ss.SSSSSS") ; 
LocalDateTime ldt = LocalDateTime.parse("2010-01-25-12.40.35.769000"); 

ldt.toString(): 2010-01-25T12: 40: 35,769

आईएसओ 8601

युक्ति: अपनी खुद की प्रारूप टेक्स्ट रूप एक तारीख का प्रतिनिधित्व करने के आविष्कार के बजाय समय मूल्य, मानक ISO 8601 स्वरूपों के लिए चिपके रहें।

जावा.टाइम कक्षा डिफ़ॉल्ट रूप से मानक प्रारूपों का उपयोग करती है। आप उपरोक्त आउटपुट में उस प्रारूप को देख सकते हैं। T दिनांक भाग को समय-समय पर अलग करता है।


java.time

बारे java.time ढांचे जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशान पुराने legacyjava.util.Date, Calendar, & SimpleDateFormat जैसी समय-समय पर कक्षाएं प्रदान करती हैं।

Joda-Time प्रोजेक्ट, अब maintenance mode में, java.time कक्षाओं में माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • Java SE 8, Java SE 9, और बाद में
    • में निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और सुधारों को जोड़ता है।
  • Java SE 6 और Java SE 7
    • java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा गया है।
  • Android
    • ThreeTenABP परियोजना adapts ThreeTen-backport विशेष रूप से (जैसा कि ऊपर उल्लेख) Android के लिए।
    • How to use ThreeTenABP… देखें।

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है।आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, और more

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