2010-10-27 27 views
30

मुझे यह कहीं भी नहीं मिला। मैं एक जेएसओएन को एक एपीआई से लाता हूं जो मानक JSON तिथियां देता है। आप एक JavaScript कंसोल में इस कोड को चलाकर प्रारूप देख सकते हैं:जेएसओएन तिथि जावा तिथि?

> new Date().toJSON(); 
"2010-10-27T11:58:22.973Z" 

ठीक है, वास्तव में, एपीआई के साथ मैं मिलीसेकंड हिस्सा नहीं लौटा रहा है काम कर रहा हूँ, और कभी कभी यह Z के बजाय एक समय क्षेत्र देता है तो,

  • 2010-10-27T11:58:22Z
  • 2010-10-27T11:58:22+03:00

: दिनांक इनमें से किसी भी जैसा हो सकता है इस तरह की तिथियों को पार्स करना कुछ हद तक बोझिल है। org.json का उपयोग करके, इन प्रकार की तिथियों को पार्स करने का कोई तरीका है?

मेरे वर्तमान समाधान है:

public static Date parseDateTime(String dateString) { 
    if (dateString == null) return null; 
    DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); 
    if (dateString.contains("T")) dateString = dateString.replace('T', ' '); 
    if (dateString.contains("Z")) dateString = dateString.replace("Z", "+0000"); 
    else 
     dateString = dateString.substring(0, dateString.lastIndexOf(':')) + dateString.substring(dateString.lastIndexOf(':')+1); 
    try { 
     return fmt.parse(dateString); 
    } 
    catch (ParseException e) { 
     Log.e(Const.TAG, "Could not parse datetime: " + dateString); 
     return null; 
    } 
} 

ओह!

+0

नीचे दी गई टिप्पणी में, आपने बताया है कि आप एंड्रॉइड के लिए कार्यान्वित कर रहे हैं। क्या आपने एंड्रॉइड 'SimpleDateFormat'' ZZZZZ' को आजमाया था? –

उत्तर

17

वह डेटटाइम प्रारूप वास्तव में आईएसओ 8601 डेटटाइम है। JSON दिनांक/समय के लिए कोई विशेष प्रारूप निर्दिष्ट नहीं करता है। यदि आप Google को थोड़ा सा करते हैं, तो आपको जावा में इसे पार्स करने के लिए बहुत सारे कार्यान्वयन मिलेंगे।

Here's one

आप के अलावा कुछ का उपयोग कर के लिए खुले हैं, तो जावा के अंतर्निहित दिनांक/समय/कैलेंडर कक्षाएं, मैं भी Joda Time सुझाव है। इन प्रकार के तारों को पार्स करने के लिए वे ISODateTimeFormat प्रदान करते हैं (कई चीजों के बीच)।

+0

+1 जोडा समय की सिफारिश के लिए –

+0

हम्म, दिलचस्प। उनका समाधान मेरे जैसा ही है :)। यह अजीब बात है कि जावा में यह अंतर्निहित नहीं है, अगर यह मानक है। – Felix

+0

जोडा समय के लिए, मेरी परियोजना एंड्रॉइड पर है और मैं जितनी संभव हो सके बाहरी बाहरी libs के रूप में उपयोग करना चाहता हूं। हालांकि टिप के लिए धन्यवाद। – Felix

6

यदि आपको एक से अधिक प्रारूपों का समर्थन करने की आवश्यकता है तो आपको पैटर्न को अपने इनपुट से मिलान करना होगा और तदनुसार पार्स करना होगा।

final DateFormat fmt; 
if (dateString.endsWith("Z")) { 
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
} else { 
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
} 

मुझे लगता है कि चाहते हैं आप एपीआई का उपयोग कर रहे हैं जो Z समयक्षेत्र तारीख पैटर्न कहीं उद्धृत किया गया है में एक बग के साथ काम कर रहे हैं ...

+0

शाब्दिक ज़ेड मान्य है - यह '+00: 00' कहने का एक और तरीका है, यानी यूटीसी समय। यह 'ज़ुलु' के लिए खड़ा है: _ "... विशेष रूप से संयुक्त राज्य अमेरिका की सेना में" ज़ुलू टाइम "के रूप में भी जाना जाता है ..." _ ([विकिपीडिया] (http://en.wikipedia.org/wiki/ समन्वित वैशविक समय)) –

13

ध्यान दें कि SimpleDateFormat प्रारूप पैटर्न जेड आरएफसी के लिए है 822 समय क्षेत्र और पैटर्न एक्स आईएसओ 8601 के लिए है (यह मानक ज़ुलू के लिए ज़ेड जैसे एकल अक्षर समय क्षेत्र नामों का समर्थन करता है)।

तो new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX") एक प्रारूप बनाता है जो "2013-03-11T01:38:18.309Z" और "2013-03-11T01:38:18.309+0000" दोनों को पार्स कर सकता है और आपको एक ही परिणाम देगा।

दुर्भाग्यवश, जहां तक ​​मैं कह सकता हूं, आप इस प्रारूप को ज़ुलू संस्करण के लिए जेड उत्पन्न करने के लिए नहीं प्राप्त कर सकते हैं, जो परेशान है।

मुझे वास्तव में दोनों प्रारूपों से निपटने के लिए जावास्क्रिप्ट पक्ष पर अधिक परेशानी है।

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