Parsing JSON DateTime from Newtonsoft's JSON Serializer Parsing JSON DateTime from Newtonsoft's JSON Serializer json json

Parsing JSON DateTime from Newtonsoft's JSON Serializer


Use one of the JsonConverters that come with Json.NET for working with dates to get a better format. JavaScriptDateTimeConverter will automatically give you a JavaScript date.

public class LogEntry    {      public string Details { get; set; }      public DateTime LogDate { get; set; }}[Test]public void WriteJsonDates(){      LogEntry entry = new LogEntry      {        LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),        Details = "Application started."      };      string defaultJson = JsonConvert.SerializeObject(entry);      // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}       string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());      // {"Details":"Application started.","LogDate":new Date(1234656000000)}  string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());      // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}    }

Documentation: Serializing Dates in JSON with Json.NET


I came up with a different approach which might be useful to some. Basically I create my own CustomDateConverter that I call when I need it. The converter takes 2 parameters, a date format e.g. yyyy-MM-dd HH:mm:ss and a TimeZoneInfo, which allows me to convert the date from UTC to the user's time zone:

public class JSONCustomDateConverter : DateTimeConverterBase{    private TimeZoneInfo _timeZoneInfo;    private string _dateFormat;    public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo)    {        _dateFormat = dateFormat;        _timeZoneInfo = timeZoneInfo;    }    public override bool CanConvert(Type objectType)    {        return objectType == typeof(DateTime);    }    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)    {        throw new NotImplementedException();    }    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)    {        writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat));        writer.Flush();    }

You can use it like this:

 var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });

Obviously you could remove anything related to time zone if you only want custom date formatting. Let me know it that helped!


As of Newtonsoft Json.Net version 4.5r5 you use the JsonPropertyAttribute Class class and set its ItemConverterType Property property.Usage:

// class to be serializedpublic class MyClass{    [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]    public DateTime? DateTime1;    public DateTime? DateTime2;}

As I have observed this will set the DateTimeConverter for all properties in this class not just the one before which is declared.