Skip to content

Instantly share code, notes, and snippets.

@mishrsud
Last active November 21, 2018 10:54
Show Gist options
  • Save mishrsud/c2982dba7d8afe0585c47c4fafffa509 to your computer and use it in GitHub Desktop.
Save mishrsud/c2982dba7d8afe0585c47c4fafffa509 to your computer and use it in GitHub Desktop.
A Date format converter that converts date and time consistently irrespective of the hosting platform or daylight savings
using System;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public class UtcSydneyDateFormatConverter : 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()
{
// Define transition times to/from DST
TimeZoneInfo.TransitionTime startTransition, endTransition;
startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0),
4, 1, DayOfWeek.Sunday);
endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0),
10, 1, DayOfWeek.Sunday);
// Define adjustment rule
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);
// Create array for adjustment rules
TimeZoneInfo.AdjustmentRule[] adjustments = {adjustment};
// Define other custom time zone arguments
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);
return aest;
}
}
public class UtcSydneyDateFormatConverter : 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()
{
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);
return aest;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment