In this post I will show how to convert UTC date to local Australian date by state. The result will be in the format of {localDateTime} – {timezone name} ({timezone abbreviation}) e.g “14/10/2018 20:30 – Australian Eastern Standard Time (AEST)”
I added this method as an extension on DateTime
public static class DateTimeExtensions
{
private static IDictionary<string, DateTimeZone> dateTimeZones = new Dictionary<string, DateTimeZone>
{
{ "NSW", DateTimeZoneProviders.Tzdb["Australia/Sydney"] },
{ "VIC", DateTimeZoneProviders.Tzdb["Australia/Melbourne"] },
{ "SA", DateTimeZoneProviders.Tzdb["Australia/Adelaide"] },
{ "QLD", DateTimeZoneProviders.Tzdb["Australia/Brisbane"] },
{ "NT", DateTimeZoneProviders.Tzdb["Australia/Darwin"] },
{ "TAS", DateTimeZoneProviders.Tzdb["Australia/Hobart"] },
{ "WA", DateTimeZoneProviders.Tzdb["Australia/Perth"] },
{ "ACT", DateTimeZoneProviders.Tzdb["Australia/Sydney"] }
};
private static readonly IDictionary<(string state, bool isDaylightSaving), string> timezoneNames = new Dictionary<(string state, bool isDaylightSaving), string>
{
{ (state: "NSW", isDaylightSaving: false), "Australian Eastern Standard Time (AEST)" },
{ (state: "VIC", isDaylightSaving: false), "Australian Eastern Standard Time (AEST)" },
{ (state: "WA", isDaylightSaving: false), "Australian Western Standard Time (AWST)" },
{ (state: "SA", isDaylightSaving: false), "Australian Central Standard Time (ACST)" },
{ (state: "TAS", isDaylightSaving: false), "Australian Eastern Standard Time (AEST)" },
{ (state: "QLD", isDaylightSaving: false), "Australian Eastern Standard Time (AEST)" },
{ (state: "ACT", isDaylightSaving: false), "Australian Eastern Standard Time (AEST)" },
{ (state: "NT", isDaylightSaving: false), "Australian Central Standard Time (ACST)" },
{ (state: "NSW", isDaylightSaving: true), "Australian Eastern Daylight Time (AEDT)" },
{ (state: "VIC", isDaylightSaving: true), "Australian Eastern Daylight Time (AEDT)" },
{ (state: "WA", isDaylightSaving: true), "Australian Western Standard Time (AWST)" },
{ (state: "SA", isDaylightSaving: true), "Australian Central Daylight Time (ACDT)" },
{ (state: "TAS", isDaylightSaving: true), "Australian Eastern Daylight Time (AEDT)" },
{ (state: "QLD", isDaylightSaving: true), "Australian Eastern Standard Time (AEST)" },
{ (state: "ACT", isDaylightSaving: true), "Australian Eastern Daylight Time (AEDT)" },
{ (state: "NT", isDaylightSaving: true), "Australian Central Standard Time (ACST)" }
};
private static ZonedDateTime ConvertUtcToZonedDateTime(this DateTime dateTime, string state)
{
if (!dateTimeZones.ContainsKey(state))
{
throw new NotSupportedException($"State is not supported {state}");
}
var time = Instant.FromDateTimeUtc(dateTime.ToUniversalTime());
var zone = dateTimeZones[state];
var zonedTime = time.InZone(zone);
return zonedTime;
}
public static DateTimeZonedInfo GetDateTimeZonedInfo(this DateTime dateTime, string state)
{
var utcDate = dateTime.ToUniversalTime();
var zonedDateTime = utcDate.ConvertUtcToZonedDateTime(state);
var timezoneName = timezoneNames[(state, zonedDateTime.IsDaylightSavingTime())];
return new DateTimeZonedInfo
{
DateTime = zonedDateTime.ToDateTimeUnspecified(),
TimezoneName = timezoneName
};
}
}
public class DateTimeZonedInfo
{
public DateTime DateTime { get; set; }
public string TimezoneName { get; set; }
public override string ToString()
{
return $"{DateTime.ToString("dd/MM/yyyy HH:mm")} - {TimezoneName}";
}
}