public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (objectType != typeof(DateTimeOffset) && objectType != typeof(DateTimeOffset?)) { return(base.ReadJson(reader, objectType, existingValue, serializer)); } var dateText = reader.Value.ToString(); if (objectType == typeof(DateTimeOffset?) && string.IsNullOrEmpty(dateText)) { return(null); } if (dateText.IndexOfAny(new[] { 'Z', 'z', '+' }) == -1 && dateText.Count(c => c == '-') == 2) { var dateTime = DateTime.Parse(dateText); var timeZone = TimeZoneConverter.ToTimeZoneInfo(this.defaultTimeZoneId); var offset = timeZone.GetUtcOffset(dateTime); return(new DateTimeOffset(dateTime, offset)); } return(DateTimeOffset.Parse(dateText)); }