using Newtonsoft.Json.Converters;
using System.Globalization;
public static void Main()
var request = @"{""start"":""2018-11-18T18:00:00Z"",""end"":""2018-11-19T03:00:00Z""}";
var deserialised = JsonConvert.DeserializeObject<ApiRequest>(request);
Console.WriteLine("Start: {0}, End: {1}", deserialised.Start, deserialised.End);
public class DateFormatConverter : IsoDateTimeConverter
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
DateTimeStyles = DateTimeStyles.AdjustToUniversal;
base.WriteJson(writer, value, serializer);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
var utcDateTime = DateTime.Parse(reader.Value.ToString());
var tz = CreateAestTimeZone();
return (DateTimeOffset) TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tz);
private TimeZoneInfo CreateAestTimeZone()
TimeZoneInfo.TransitionTime startTransition, endTransition;
startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0),
endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0),
10, 1, DayOfWeek.Sunday);
TimeSpan delta = new TimeSpan(1, 0, 0);
TimeZoneInfo.AdjustmentRule adjustment;
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1999, 10, 1),
DateTime.MaxValue.Date, delta, startTransition, endTransition);
TimeZoneInfo.AdjustmentRule[] adjustments = {adjustment};
string displayName = "(GMT+10:00) Australia/Sydney";
string standardName = "Australian Eastern Standard Time";
string daylightName = "Australian Eastern Daylight Time";
TimeSpan offset = new TimeSpan(11, 0, 0);
TimeZoneInfo aest = TimeZoneInfo.CreateCustomTimeZone(standardName, offset, displayName, standardName,
daylightName, adjustments);
[JsonConverter(typeof (DateFormatConverter))]
public DateTimeOffset Start
[JsonConverter(typeof (DateFormatConverter))]
public DateTimeOffset End