2014-05-06 8 views
7

मेरे पास "05/06/2014 05:54:00 अपराह्न -04: 00" की डेटटाइम ऑफसेट ऑब्जेक्ट है।क्या Json.NET के साथ zulu टाइम स्ट्रिंग पर डेटटाइम ऑफसेट को क्रमबद्ध करना संभव है?

जब जेसन.नेट और आईएसओ सेटिंग का उपयोग करके क्रमबद्ध किया जाता है, तो मुझे "2014-05-06T17: 54: 00-04: 00" मिलता है।

मैं उस स्ट्रिंग का यूटीसी/ज़ुलू संस्करण "2014-05-06T21: 54: 00Z" चाहता हूं।

हालांकि, मुझे यह प्राप्त करने के लिए कोई धारावाहिक सेटिंग नहीं मिल सका। मैं डेटटाइम सीरियलाइजेशन के लिए जानता हूं, मैं डेटटाइमज़ोन हैंडलिंग = डेटटाइमज़ोन हैंडलिंग.यूटीसी को ज़ुलू प्रारूप के लिए सेट कर सकता हूं। हालांकि, डेटटाइम ऑफसेट के लिए ऐसा सेटिंग विकल्प नहीं है। क्या मैं कुछ भूल रहा हूँ? या क्या मुझे इसके लिए एक कस्टम ओवरराइड बनाना है?

उत्तर

15

IsoDateTimeConverter कि Json.Net के साथ आता है उपयोग करने का प्रयास :

var date = new DateTime(2014, 5, 6, 17, 24, 55, DateTimeKind.Local); 
var obj = new { date = new DateTimeOffset(date) }; 

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.Converters.Add(new IsoDateTimeConverter 
{ 
    DateTimeFormat = "yyyy-MM-ddTHH:mm:ssZ", 
    DateTimeStyles = DateTimeStyles.AdjustToUniversal 
}); 

string json = JsonConvert.SerializeObject(obj, settings); 
Console.WriteLine(json); 

आउटपुट:

{"date":"2014-05-06T22:24:55Z"} 
+0

मुझे संदेह है कि ऐसा करने के लिए एक अंतर्निहित तरीका होना चाहिए, लेकिन मुझे यह नहीं मिला ... +1 –

+0

@ थॉमस लेवेस्क मुझे यकीन नहीं है कि क्यों Json.Net इस कनवर्टर को स्वचालित रूप से 'डेटटाइम ऑफसेट' के लिए लागू नहीं करता है जैसा कि यह 'डेटटाइम' के लिए प्रतीत होता है, लेकिन इसे मैन्युअल रूप से लागू करना काम करता है। उसमें विफल होने के बाद, हाँ, मैं आपके उत्तर में दिखाए गए काम को करने के लिए एक कस्टम कनवर्टर लिखूंगा। –

+0

आपको केवल डेटटाइम स्टाइल = डेटटाइम स्टाइल की आवश्यकता है। एडजस्टोउ यूनिवर्सल, डेटटाइमफॉर्मैट –

7

आप इस तरह एक कस्टम कनवर्टर लिख सकते हैं:

class UtcDateTimeOffsetConverter : Newtonsoft.Json.Converters.IsoDateTimeConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     if (value is DateTimeOffset) 
     { 
      var date = (DateTimeOffset)value; 
      value = date.UtcDateTime; 
     } 
     base.WriteJson(writer, value, serializer); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     object value = base.ReadJson(reader, objectType, existingValue, serializer); 
     if (value is DateTimeOffset) 
     { 
      var date = (DateTimeOffset)value; 
      value = date.ToLocalTime(); 
     } 
     return value; 
    } 
} 

और तुम JsonConverter विशेषता का उपयोग करना चाहते हैं की संपत्ति पर लागू होते हैं:

[JsonConverter(typeof(UtcDateTimeOffsetConverter))] 
public DateTimeOffset Date { get; set; } 
+0

बहुत विस्तृत उत्तर के लिए धन्यवाद। मुझे लगता है कि मैं JsonConvert.DefaultSettings का उपयोग करके वैश्विक रूप से इस कनवर्टर को लागू कर सकता हूं। मुझे बाद में यह कोशिश करनी होगी। – Zoomzoom

+0

@ ज़ूमज़ूम, ब्रायन के उत्तर को भी देखें, यह आसान है –

+0

आप दोनों के लिए धन्यवाद। – Zoomzoom

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

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