2013-02-21 16 views
18

मैं JavaScriptSerializer उपयोग कर रहा हूँ से एक दिन घटाकर है, लेकिन जब मैं deserialize यह एक दिन की तारीख यह serialize पाने से कम दिखाने:JavaScriptSerializer दिनांक समय serializing के लिए तारीख

DateTime startDate=new DateTime(2012,1,20);//set the 20th of January 
    JavaScriptSerializer serializer=new JavaScriptSerializer(); 
    string serializeDate= serializer.Serialize(startDate); 
    DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);//I get 19th of Jan 
    Assert.Equals(startDate, afterDeserialize); 

सबसे पहले:

यहां परीक्षण है मैं इसे जावास्क्रिप्ट डेटाटाइम प्रारूप के कारण करता हूं लेकिन जैसा कि मुझे जावास्क्रिप्ट माह के लिए पता है शून्य सूचकांक 0=January है, लेकिन मुझे मूल तिथि से एक दिन कम मिल रहा है।

+0

समाधान 1: टाइमज़ोन के साथ चारों ओर मक, समाधान 2: केवल वर्ष, महीने और दिन को अलग-अलग मानों के रूप में स्टोर करें, फिर deserialization के बाद पुनः संयोजित करें। – JDB

उत्तर

18

यह मनमाने ढंग से एक दिन नहीं खो रहा है, यह एक यूटीसी तिथि में परिवर्तित हो रहा है (या मुझे यूटीसी तिथि प्रारूप में तारीख का उपयोग करना चाहिए) ताकि जब यह अनसुलझा हो जाए तो आप अपने व्यक्तिगत समय क्षेत्र में नहीं रहेंगे। यह मूल रूप से कार्य कर रही है:

DateTime whateverDate = /* incoming date */; 
long ticks = whateverDate.ToUniversalTime() // make UTC 
    .Subtract(new DateTime(1970, 1, 1))  // subtract UNIX Epoch 
    .TotalMilliseconds();      // get milliseconds since then 
// push in to the "\/Date(ticks)\/" format 
String value = String.Format(@"\/Date({0})\/", ticks); 

हालांकि, निम्न प्रयास करें:

// or you rely on it serializing, then bring it back to your own local time 
// (apply the time zone). 
afterDeserialize = afterDeserialize.ToLocalTime(); 

अब आप UTC समय वापस अपने स्थानीय समय करना होगा (समय क्षेत्र के साथ लागू)।


अपने परीक्षा उत्तीर्ण:

DateTime startDate    = new DateTime(2012,1,20); 
JavaScriptSerializer serializer = new JavaScriptSerializer(); 
String serializeDate   = serializer.Serialize(startDate); 
DateTime afterDeserialize  = serializer.Deserialize<DateTime>(serializeDate) 
            .ToLocalTime(); // Note: this is added 

Assert.Equals(startDate, afterDeserialize); // pass! 
+2

यह [दस्तावेज व्यवहार] है (http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2), हालांकि बहुत अस्पष्ट है। – JDB

+0

डेटटाइम स्टार्टडेट = नया डेटटाइम (2012, 1, 20) .ऑन यूनिवर्सलटाइम(); यह 1 9 जनवरी से स्टार्टडेट सेट करता है? और वही प्राप्त करने पर deserialize ... यह क्यों हो रहा है? –

+1

http://blog.devarchive.net/2008/02/serializing-datetime-values-using.html यहां एक ब्लॉग है जो समस्या को विस्तार से समझाता है – Evelie

2

JavaScriptSerializer deserializing मुझे UTC (Universal Time) में उत्पादन दे रही है जो घंटे में परिवर्तन के कारण तारीख बदल पर। Brad Christie ने डेटटाइम को यूटीसी में बदलने का सुझाव दिया है, यह समस्याएं हल कर सकता है।

लेकिन असल में परिवर्तित करने के लिए कोई जरूरत नहीं है:

DateTime startDate = new DateTime(2012, 1, 20).ToUniversalTime(); 

के रूप में यह पहले से ही यूनिवर्सल समय के रूप में यह लग रहा है। तो मैं सिर्फ LocalTime को deserialize के उत्पादन में कन्वर्ट:

DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate); 
afterDeserialize.ToLocalTime(); 

यह समस्या हल हो जाती।

+0

मजेदार, बस मेरे जवाब के अपडेट में टाइप करने के बीच में था। ;-) –

+0

:), आपके उत्तर को सही चिह्नित किया गया है, और बस इसे यहां रखें, इसलिए यह दूसरों की सहायता करता है –

1

मैं एक ही समस्या थी और

Newtonsoft.Json.JsonConvert.SerializeObject() 
बजाय

new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(). 

बाद कॉल भंडार अपने दिनांक समय कुछ यादृच्छिक समय-क्षेत्र पर परिवर्तित का उपयोग करके इसे हल (GMT + 0 hardcoded किया जा रहा है) ।

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