दिलचस्प पोस्ट
JSON.पार्स बनाम eval () एंड्रॉइड लकड़हारा में GC_FOR_MALLOC, GC_EXPLICIT, और अन्य GC_ * क्या मतलब है? दो डुप्लिकेट को घुमाने के दो प्रेतों की टकराव का पता लगा रहा है रूबी में फ़ाइल प्रकार निर्धारित करें सबसे अच्छा तीन-रास्ता मर्ज टूल क्या है? Jsonp POST अनुरोध बनाने के लिए कैसे jQuery के साथ contentType निर्दिष्ट करता है? क्या यह मानना ​​सुरक्षित है कि एसटीएल वेक्टर भंडारण हमेशा सम्मिलित है? IE8 में console.log का क्या हुआ? ऑटो मार्जिन में क्या होता है: 0 ऑटो? WCF सेवा बनाने के लिए WSDL फ़ाइल का उपयोग कैसे करें (कॉल नहीं करें) मेकफाइल में लूप कैसे लिखूं? उत्तरदायी छवि मानचित्र रेल के 3 रूपों के लिए रूबी में _nownowman param क्या है? क्या है ?: PHP 5.3 में? jqGrid – बचत चेकबॉक्स चयनित राज्य

JavaScriptSerializer यूटीसी दिनांक समय समस्याएं

हमारा ग्राहक ब्राउज़र में दिनांक और समय मान को दिखाना चाहता है जैसे वे डेटाबेस में हैं, और हम उन्हें डेटाबेस में यूटीसी के रूप में संग्रहीत कर रहे हैं।

पहले हमें सीरियलाइज़ेशन और जावास्क्रिप्ट की ओर से कुछ समस्याएं थीं। दिनांक समय मान दो बार स्थानांतरित हो गया – पहले मशीन के स्थानीय समय क्षेत्र से मेल करने के लिए और फिर ब्राउज़र में समय क्षेत्र का मिलान करने के लिए। हमने जावास्क्रिप्ट स्तरीयजर के लिए कस्टम कनवर्टर जोड़कर इसे तय किया है। हमने सीरियलाइज ओवरराइड में दिनांकटाइम के लिए डेटटाइम किंड। यूटीसी के रूप में चिह्नित किया है। सीरियलाइज से डेटा को वापस खिलाना थोड़ा कठिन था लेकिन हमें कुछ यूरी हैक मिला जो उसी JavaScriptSerializer / दिनांक (28676 9 410010) / प्रारूप में दिनांक के समय के मूल्यों को वापस करने में मदद करता था लेकिन स्थानीय समय के बिना स्थानांतरण के। जावास्क्रिप्ट की तरफ हमने निर्माण दिनांक () ऑब्जेक्ट ऑफसेट करने के लिए केंडोयूआई जेएस लाइब्रेरी को पैच किया है ताकि वे दिख सकें जैसे वे यूटीसी हैं।

तब हम दूसरी तरफ काम करना शुरू कर दिया, deserialization फिर, हमें JSON.stringify के बजाय एक कस्टम कतार का उपयोग करने के लिए हमारे कोड को समायोजित करना पड़ा, जो फिर स्थानीय समय से यूटीसी में परिवर्तित होने पर डेटा को ऑफसेट करता है। सब कुछ अब तक अच्छा लग रहा था।

लेकिन इस परीक्षा को देखें:

public void DeserialiseDatesTest() { var dateExpected = new DateTime(1979, 2, 2, 2, 10, 10, 10, DateTimeKind.Utc); // this how the Dates look like after serializing // anothe issue, unrelated to the core problem, is that the "\" might get stripped out when dates come back from the browser // so I have to add missing "\" or else Deserialize will break string s = "\"\\/Date(286769410010)\\/\""; // this get deserialized to UTC date by default JavaScriptSerializer js = new JavaScriptSerializer(); var dateActual = js.Deserialize<DateTime>(s); Assert.AreEqual(dateExpected, dateActual); Assert.AreEqual(DateTimeKind.Utc, dateActual.Kind); // but some Javascript components (like KendoUI) sometimes use JSON.stringify // for Javascript Date() object, thus producing the following: s = "\"1979-02-02T02:10:10Z\""; dateActual = js.Deserialize<DateTime>(s); // If your local computer time is not UTC, this will FAIL! Assert.AreEqual(dateExpected, dateActual); // and the following fails always Assert.AreEqual(DateTimeKind.Utc, dateActual.Kind); } 

JavaScriptSerializer deserialize \/Date(286769410010)\/ स्ट्रिंग्स यूटीसी समय पर क्यों करता है लेकिन 1979-02-02T02:10:10Z स्थानीय समय के लिए?

हमने अपने कस्टम JavascriptConverter कनवर्टर पर एक डिसेराइलाइज विधि जोड़ने की कोशिश की लेकिन समस्या यह है कि Deserialize कभी नहीं कहा जाता है अगर हमारे जावास्क्रिप्ट कनवर्टर में निम्न प्रकार हैं:

  public override IEnumerable<Type> SupportedTypes { get { return new List<Type>() { typeof(DateTime), typeof(DateTime?) }; } } 

मुझे लगता है कि, Deserialize को केवल तभी बुलाया जाएगा यदि SupportedTypes प्रकार में कुछ जटिल संस्थाओं के प्रकार शामिल हैं, जिनमें डेटटाइम फ़ील्ड हैं।

तो, JavaScriptSerializer और JavascriptConverter में दो विसंगतियां हैं:

  • सीरियलाइज प्रत्येक डेटा आइटम के लिए सपोर्टेड टाइप में सरल प्रकारों को ध्यान में रखता है, लेकिन डिसेराइलाइज यह सरल प्रकारों के लिए अनदेखी करता है
  • Desarialize कुछ तिथियाँ UTC और कुछ के रूप में – स्थानीय समय के रूप में।

क्या इन मुद्दों को ठीक करने का कोई आसान तरीका है? हम कुछ अन्य सीरियलआइज़र के साथ JavaScriptSerializer को बदलने के लिए थोड़ा डरते हैं, क्योंकि शायद हम में से कुछ तीसरी पार्टी पुस्तकालयों का उपयोग कर रहे हैं, JavaScriptSerializer कुछ निश्चित सुविधाओं / बगों पर भरोसा कर रहे हैं।

वेब के समाधान से एकत्रित समाधान "JavaScriptSerializer यूटीसी दिनांक समय समस्याएं"

JavaScriptSerializer , और DataContractJsonSerializer कीड़े के साथ छल लिया गया है इसके बजाय json.net का उपयोग करें यहां तक ​​कि माइक्रोसॉफ्ट ने एएसपी.Net MVC4 और अन्य हालिया परियोजनाओं में यह स्विच बना दिया है।

/Date(286769410010)/ प्रारूप स्वामित्व है और माइक्रोसॉफ्ट द्वारा बनाया गया है। इसमें समस्याएं हैं, और व्यापक रूप से समर्थित नहीं हैं। आपको हर जगह 1979-02-02T02:10:10Z प्रारूप का उपयोग करना चाहिए। यह ISO8601 और RF3339 में परिभाषित किया गया है यह दोनों मशीन और मानव पठनीय है, शास्त्रीय रूप से वर्गीकृत, संस्कृति अपरिवर्तनीय और स्पष्ट है।

जावास्क्रिप्ट में, अगर आप गारंटी दे सकते हैं कि आप नए ब्राउज़रों पर चलेंगे, तो इसका उपयोग करें:

 date.toISOString() 

संदर्भ यहाँ है

यदि आप पूर्ण क्रॉस-ब्राउज़र और पुराने-ब्राउज़र समर्थन चाहते हैं, तो इसके बजाय moment.js का उपयोग करें

अद्यतन करें

एक तरफ, यदि आप JavaScriptSerializer स्तरीयज़र का उपयोग JavaScriptSerializer चाहते हैं, तो आप एक DateTimeOffset ऑफसेट को हटाना चाहते हैं, जो सही समय की रक्षा करेगा। आप वहां से यूटीसी DateTime प्राप्त कर सकते हैं, निम्नानुसार:

 // note, you were missing the milliseconds in your example, I added them here. s = "\"1979-02-02T02:10:10.010Z\""; dateActual = js.Deserialize<DateTimeOffset>(s).UtcDateTime; 

आपका परीक्षण अब पास होगा