Last active
November 21, 2018 10:54
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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