2010-07-06 6 views
25

के deserialization पर टाइमज़ोन रूपांतरण को रोकें मेरे पास एक कक्षा है जिसे मैं XmlSerializer का उपयोग करके क्रमबद्ध/deserialize है। इस वर्ग में DateTime फ़ील्ड है।डेटटाइम मान

जब धारावाहिक, DateTime फ़ील्ड को एक स्ट्रिंग द्वारा दर्शाया जाता है जिसमें जीएमटी से ऑफ़सेट शामिल है, उदाहरण के लिए 2010-05-05T09:13:45-05:00। जब deserialized, इन बार deserialization प्रदर्शन मशीन के स्थानीय समय में परिवर्तित कर रहे हैं।

कारणों के लिए समझाए जाने योग्य कारणों के लिए, मैं इस टाइमज़ोन रूपांतरण को होने से रोकना चाहता हूं। धारावाहिक जंगली में होता है, जहां इस वर्ग के कई संस्करण मौजूद हैं। Deserialization एक सर्वर पर होता है जो मेरे नियंत्रण में है। ऐसा लगता है, ऐसा लगता है कि यह deserialization के दौरान सबसे अच्छा संभाला जाएगा।

IXmlSerializable को लागू करने और "हाथ से" सभी deserialization को लागू करने के अलावा, मैं यह कैसे हो सकता है?

+0

क्या कोई मुझे इस प्रश्न के सटीक उपाध्यक्ष पर एक लिंक दे सकता है? (.NET सर्वर से जावास्क्रिप्ट क्लाइंट तक डेटटाइम पास करना) – Siddhant

उत्तर

22

DateTime के रूप में पार्सिंग के बजाय आप इसे DateTimeOffset के रूप में पार्स कर सकते हैं और टाइमज़ोन को अनदेखा करने के लिए DateTimeOffset.DateTime प्रॉपर्टी का उपयोग कर सकते हैं। इस तरह:

[XmlIgnore()] 
public DateTime Time { get; set; } 

[XmlElement(ElementName = "Time")] 
public string XmlTime 
{ 
    get { return XmlConvert.ToString(Time, XmlDateTimeSerializationMode.RoundtripKind); } 
    set { Time = DateTimeOffset.Parse(value).DateTime; } 
} 
+0

इसके अलावा, क्योंकि मैं इकाई ढांचे का उपयोग कर रहा हूं, मुझे [XmlElement ...] के शीर्ष पर [NotMapped] रखना था, लेकिन यह समाधान मेरे लिए सही काम करता है। धन्यवाद –

2

आप this पद से पता चलता है की तरह कुछ की कोशिश कर सकते हैं और एक नया स्ट्रिंग संपत्ति बनाने के लिए और मौजूदा एक XmlIgnore:

रखो [XmlIgnore] समय की संपत्ति पर।

फिर नई प्रॉपर्टी जोड़ने:

[XmlElement(DataType="string",ElementName="Time")] 
public String TimeString 
{ 
    get { return this.timeField.ToString("yyyy-MM-dd"); } 
    set { this.timeField = DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); } 
} 
+0

मुझे अद्यतन संस्करण का उपयोग कर कक्षा के पुराने संस्करणों को deserialize करने की जरूरत है। क्या यह ब्रेक संगतता नहीं होगी? मैं अपनी डेटटाइम संपत्ति का नाम बदल सकता हूं और एक स्ट्रिंग प्रॉपर्टी जोड़ सकता हूं जिसमें वही नाम है जो डेटटाइम का उपयोग किया जाता है। लेकिन, यह उन ग्राहकों को तोड़ देगा जो डेटटाइम संपत्ति का संदर्भ देते हैं। – Odrade

+1

ओह, अब मैं देखता हूं कि एलिमेंट नाम Xml में वही रहेगा। मुझे इसे आज़माएं। – Odrade

+1

यह कोड आपके मौजूदा ग्राहकों के साथ काम नहीं करेगा क्योंकि DateTime.ParseExact विफल हो जाएगा (क्योंकि उस प्रारूप में समय नहीं है)। यदि आप डेटटाइम ऑफसेट के रूप में पार्स करते हैं तो यह आपके मौजूदा ग्राहकों के साथ काम करेगा। –

2

मैं जानता हूँ कि यह पुराना है लेकिन आशा है कि यह भविष्य में किसी को मदद मिलती है।

यहाँ एक्सएमएल मैं deserializing किया गया था:

enter image description here

यह 3 पार्टी जो उत्पादन प्रकट होता है:

<timePeriod>1982-03-31T00:00:00+11:00</t 

एक्सएमएल मैं 30 वीं नहीं 31 के साथ अंत deserializing के बाद यह एक्सएमएल (जो मैं उपयोग कर रहा हूं) टाइमज़ोन को डेलाइट सेविंग के दौरान +11 में बदलता है और इसे +10 के रूप में तब रखता है जब डेलाइट सेविंग (डीएसटी) नहीं होता है।

जॉन स्कीट यूटीसी के अनुसार डीएसटी नहीं मानना ​​चाहिए: https://stackoverflow.com/a/5495816/495455


इसके अलावा प्रलेखन Coding Best Practices Using DateTime in the .NET Framework ध्यान दें:

एक्सएमएल serializer हमेशा मानता है कि दिनांक समय मान धारावाहिक की जा रही स्थानीय मशीन समय का प्रतिनिधित्व करते हैं, इसलिए यह एन्कोडेड एक्सएमएल समय के ऑफसेट हिस्से के रूप में मशीन स्थानीय समय क्षेत्र ऑफ़सेट लागू करता है। जब हम इसे किसी अन्य मशीन पर deserialize, मूल ऑफसेट पार्स किए गए मान से घटाया जाता है, और वर्तमान मशीन का समय-क्षेत्र ऑफसेट जोड़ा जाता है।


निम्नलिखित कोड मुझे तारीख 31 के रूप में स्वरूपित प्राप्त करने के लिए अनुमति दी है, लेकिन यह अभ्यस्त गैर Daylioght सहेजा जा रहा है दिनांक (इस फ़ीड में दी गई) के लिए 100% काम:

TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); 
DateTime easternTimeNow = TimeZoneInfo.ConvertTimeFromUtc(dataPoint.timePeriod, easternZone); 
System.Diagnostics.Debug.WriteLine(easternTimeNow.ToString()); 

इसलिए समाधान है एक्सएमएल फ़ीड को ठीक करें ताकि यह यूटीसी के डीएसटी के साथ वैकल्पिक न हो।

संपादित करें:क्यों डेटा का बैकअप

बँधा हुआ था वह अपने नहीं 3 पार्टी विक्रेता पता चला है के रूप में डीएसटी के साथ यूटीसी बदलते। एक्सएमएल फ़ीड जावा स्विंग फ्रेमवर्क द्वारा एक एसक्यूएल डीबी पढ़ने के द्वारा बनाया गया है। आम तौर पर मैं एक्सएमएल मानक प्रतिनिधित्व (xsd: dateTime) - IS0 8601 के साथ रखने की अनुशंसा करता हूं, लेकिन इस मामले में टी काम के बाद सब कुछ स्ट्रिंग और फिसलने का उपयोग करना। अस्वीकरण, मैं अभी भी फ़ीड बदलने की कोशिश कर रहा हूं, अनुशंसा करता हूं कि आप प्रोड में ऐसा न करें। अपने जोखिम पार इस्तेमाल करें!!

27

मैं क्या किया था, यह विधि DateTime.SpecifyKind उपयोग करने के लिए, निम्नलिखित के रूप में किया गया था:

DateTime dateTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified); 

और यह मेरी समस्या को हल है, मैं इस मदद आप की उम्मीद है।

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

  • कोई संबंधित समस्या नहीं^_^