using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public static void Main()
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new ConditionalDateTimeResolver();
ConvertThis = new DateTime(2020, 8, 18, 15, 7, 1),
DontConvertThis = new DateTime(2020, 8, 18, 15, 7, 1)
string json = JsonConvert.SerializeObject(bank, settings);
public string Name { get; set; }
public DateTime ConvertThis { get; set; }
public DateTime DontConvertThis { get; set; }
public class ConditionalDateTimeResolver : DefaultContractResolver
static readonly JsonConverter DateTimeConverter = new JsonDateTimeConverter();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
JsonProperty prop = base.CreateProperty(member, memberSerialization);
if (DateTimeConverter.CanConvert(prop.PropertyType) &&
!prop.AttributeProvider.GetAttributes(typeof(TimeZoneIgnore), true).Any())
prop.Converter = DateTimeConverter;
public class JsonDateTimeConverter : DateTimeConverterBase
public override bool CanConvert(Type objectType)
return objectType == typeof(DateTime) || 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)
DateTime? dateTime = (value as DateTime?).ConvertToTimeZone("CEST");
writer.WriteValue(dateTime);
[AttributeUsage(AttributeTargets.Property)]
public class TimeZoneIgnore : Attribute { }
public static class DateExtensions
public static DateTime? ConvertToTimeZone(this DateTime? date, string timeZoneId)
if (timeZoneId == "CEST") timeZoneId = "Europe/Amsterdam";
return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(date.Value, timeZoneId);