javascript - "दाएं" JSON दिनांक प्रारूप




(7)

मैंने JSON दिनांक प्रारूप के लिए कई अलग-अलग मानकों को देखा है:

"\"\\/Date(1335205592410)\\/\""         .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\""    .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z"              JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00"             ISO 8601

कौन सा सही है? या सबसे अच्छा? क्या इस पर कोई मानक है?


JSON तारीखों के बारे में कुछ भी नहीं जानता है। क्या .NET एक गैर-मानक हैक / एक्सटेंशन है।

मैं ऐसे प्रारूप का उपयोग करूंगा जिसे आसानी से जावास्क्रिप्ट में Date ऑब्जेक्ट में परिवर्तित किया जा सकता है, यानी एक जिसे new Date(...) पारित किया जा सकता है। सबसे आसान और शायद सबसे पोर्टेबल प्रारूप 1 9 70 से मिलीसेकंड युक्त टाइमस्टैम्प है।


इसका केवल एक सही जवाब है और अधिकांश सिस्टम इसे गलत मानते हैं। युग के बाद मिलीसेकंड की संख्या, उर्फ ​​एक 64 बिट पूर्णांक। टाइम जोन एक यूआई चिंता है और ऐप परत या डीबी परत में कोई व्यवसाय नहीं है। आपके डीबी की देखभाल क्यों समय क्षेत्र कुछ है, जब आप जानते हैं कि यह इसे 64 बिट पूर्णांक के रूप में स्टोर करने जा रहा है तो रूपांतरण गणना करें।

बाहरी बिट्स को बाहर निकालें और यूआई तक संख्याओं के रूप में तारीखों का इलाज करें। आप प्रश्न और तर्क करने के लिए सरल अंकगणितीय ऑपरेटरों का उपयोग कर सकते हैं।


मुझे लगता है कि वास्तव में उपयोग के मामले पर निर्भर करता है। कई मामलों में उचित ऑब्जेक्ट मॉडल (स्ट्रिंग को दिनांक प्रस्तुत करने के बजाय) का उपयोग करना अधिक फायदेमंद हो सकता है, जैसे:

{
     "year": 2012,
     "month": 4,
     "day": 23,
     "hour": 18,
     "minute": 25,
     "second": 43,
     "timeZone": "America/New_York"
}

माना जाता है कि यह आरएफसी 3339 की तुलना में अधिक वर्बोज़ है लेकिन:

  • यह भी मानव पठनीय है
  • यह एक उचित ऑब्जेक्ट मॉडल लागू करता है (जैसा ओओपी में है, जहां तक ​​JSON इसे अनुमति देता है)
  • यह समय क्षेत्र का समर्थन करता है (दी गई तारीख और समय पर केवल यूटीसी ऑफ़सेट नहीं)
  • यह मिलीसेकंड, नैनोसेकंड, ... या बस fractional सेकंड जैसे छोटे इकाइयों का समर्थन कर सकते हैं
  • इसे एक अलग पार्सिंग चरण (डेट-टाइम स्ट्रिंग को पार्स करने के लिए) की आवश्यकता नहीं है, जेएसओएन पार्सर आपके लिए सब कुछ करेगा
  • किसी भी भाषा में किसी भी दिनांक-समय ढांचे या कार्यान्वयन के साथ आसान निर्माण
  • अन्य कैलेंडर स्केल (हिब्रू, चीनी, इस्लामी ...) और युग (एडी, बीसी, ...) का समर्थन करने के लिए आसानी से बढ़ाया जा सकता है
  • यह साल 10000 सुरक्षित है ;-) (आरएफसी 3339 नहीं है)
  • पूरे दिन की तारीखों और फ़्लोटिंग समय का समर्थन करता है (जावास्क्रिप्ट की Date.toJSON() नहीं)

मुझे नहीं लगता कि सही सॉर्टिंग (जैसा आरएफसी 3339 के लिए फ़नलर द्वारा नोट किया गया है) एक ऐसी सुविधा है जिसे JSON की तारीख को क्रमबद्ध करते समय वास्तव में आवश्यक है। साथ ही यह समय-समय पर एक ही समय क्षेत्र ऑफसेट होने के लिए सच है।


यह पार्स सर्वर के साथ मेरे लिए काम है

{
    "ContractID": "203-17-DC0101-00003-10011",
    "Supplier":"Sample Co., Ltd",
    "Value":12345.80,
    "Curency":"USD",
    "StartDate": {
                "__type": "Date",
                "iso": "2017-08-22T06:11:00.000Z"
            }
}

संदर्भ के लिए मैंने इस प्रारूप का उपयोग किया है:

Date.UTC(2017,2,22)

यह JSONP के साथ काम करता है जो $.getJSON() फ़ंक्शन द्वारा समर्थित है। यकीन नहीं है कि मैं इस दृष्टिकोण की सिफारिश करने के लिए अब तक जाऊंगा ... बस इसे एक संभावना के रूप में बाहर फेंक रहा है क्योंकि लोग इसे इस तरह से कर रहे हैं।

एफडब्ल्यूआईडब्लू: कभी भी संचार प्रोटोकॉल में युग के बाद से सेकंड का उपयोग न करें, न ही युग के बाद मिलीसेकंड, क्योंकि ये लीप सेकेंड के यादृच्छिक कार्यान्वयन के लिए खतरे से भरे हुए हैं (आपको पता नहीं है कि प्रेषक और रिसीवर दोनों यूटीसी लीप सेकेंड को सही तरीके से कार्यान्वित करते हैं या नहीं)।

पालतू जानवर की तरह नफरत है, लेकिन कई लोग मानते हैं कि यूटीसी जीएमटी के लिए सिर्फ नया नाम है - गलत! यदि आपका सिस्टम लीप सेकेंड को लागू नहीं करता है तो आप जीएमटी का उपयोग कर रहे हैं (अक्सर गलत होने के बावजूद यूटीसी कहा जाता है)। यदि आप लीप सेकंड को पूरी तरह कार्यान्वित करते हैं तो आप वास्तव में यूटीसी का उपयोग कर रहे हैं। भविष्य के छलांग के सेकंड ज्ञात नहीं हो सकते हैं; वे आईईआर द्वारा आवश्यकतानुसार प्रकाशित होते हैं और निरंतर अपडेट की आवश्यकता होती है। यदि आप एक ऐसी प्रणाली चला रहे हैं जो लीप सेकेंड को कार्यान्वित करने का प्रयास करता है लेकिन इसमें संदर्भ और पुरानी संदर्भ तालिका (आपके विचार से कहीं अधिक आम है) तो आपके पास न तो जीएमटी है, न ही यूटीसी, आपके पास यूटीसी होने का नाटक करने वाला एक विजयी सिस्टम है।

इन दिनांक काउंटर केवल टूटे हुए प्रारूप (वाई, एम, डी, आदि) में व्यक्त किए जाने पर संगत होते हैं। वे एक युग प्रारूप में कभी भी अनुकूल नहीं हैं। यह याद रखना।


JSON स्वयं निर्दिष्ट नहीं करता कि दिनांकों का प्रतिनिधित्व कैसे किया जाना चाहिए, लेकिन जावास्क्रिप्ट करता है।

आपको Date की toJSON विधि द्वारा उत्सर्जित प्रारूप का उपयोग करना चाहिए :

2012-04-23T18:25:43.511Z

यहाँ पर क्यों:

  1. यह मानव पठनीय है लेकिन संक्षेप में भी है

  2. यह सही ढंग से ठीक है

  3. इसमें fractional सेकंड शामिल हैं, जो कालक्रम को फिर से स्थापित करने में मदद कर सकते हैं

  4. यह आईएसओ 8601 के अनुरूप है

  5. आईएसओ 8601 एक दशक से अधिक समय से अंतरराष्ट्रीय स्तर पर अच्छी तरह से स्थापित किया गया है

  6. आईएसओ 8601 डब्ल्यू 3 सी , RFC3339 , और RFC3339 द्वारा अनुमोदित है

ऐसा कहा जा रहा है कि , लिखे गए प्रत्येक दिनांक पुस्तकालय को "1 9 70 से मिलीसेकंड" समझा जा सकता है। तो आसान पोर्टेबिलिटी के लिए, ThiefMaster सही है।


कोई सही प्रारूप नहीं है ; JSON विनिर्देश दिनांकों का आदान-प्रदान करने के लिए प्रारूप निर्दिष्ट नहीं करता है, यही कारण है कि ऐसा करने के कई अलग-अलग तरीके हैं।

सबसे अच्छा प्रारूप तर्कसंगत रूप से आईएसओ 8601 प्रारूप में प्रदर्शित एक तारीख है ( विकिपीडिया देखें ); यह एक प्रसिद्ध और व्यापक रूप से प्रयुक्त प्रारूप है और इसे कई अलग-अलग भाषाओं में संभाला जा सकता है, जिससे यह अंतःक्रियाशीलता के लिए बहुत उपयुक्त हो जाता है। यदि आपके द्वारा जेनरेट किए गए जेसन पर नियंत्रण है, उदाहरण के लिए, आप जेएसओ प्रारूप में अन्य सिस्टम को डेटा प्रदान करते हैं, 8601 चुनने के रूप में डेट इंटरचेंज प्रारूप एक अच्छी पसंद है।

यदि आपके द्वारा जेनरेट किए गए जेसन पर नियंत्रण नहीं है, उदाहरण के लिए, आप कई अलग-अलग मौजूदा सिस्टमों से जेसन का उपभोक्ता हैं, तो इसे संभालने का सबसे अच्छा तरीका यह है कि अपेक्षित विभिन्न प्रारूपों को संभालने के लिए उपयोगिता फ़ंक्शन उपयोगिता फ़ंक्शन हो।





json