Is it possible to serialize DateTimeOffset for zulu time string with Json.NET?

I have a DateTimeOffset object from "05/06/2014 05:54:00 PM -04: 00".

When serializing using Json.NET and ISO settings, I get "2014-05-06T17: 54: 00-04: 00".

I would like to have the UTC / Zulu version of this line "2014-05-06T21: 54: 00Z".

However, for this I could not find the serializer settings. I know for serializing DateTime, I can set DateTimeZoneHandling = DateTimeZoneHandling.Utc to have Zulu format. However, there is no such parameter for the DateTimeOffset parameter. Am I missing something? Or do I need to create a custom override for this?

+7
c # datetimeoffset
source share
2 answers

Try using the IsoDateTimeConverter that comes with 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); 

Output:

 {"date":"2014-05-06T22:24:55Z"} 
+15
source share

You can write your own converter as follows:

 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; } } 

And apply it to the property you want to use with the JsonConverter attribute:

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

All Articles