diff --git a/Oqtane.Client/Resources/TimeZoneResources.resx b/Oqtane.Client/Resources/TimeZoneResources.resx index d736dcea..1af7de15 100644 --- a/Oqtane.Client/Resources/TimeZoneResources.resx +++ b/Oqtane.Client/Resources/TimeZoneResources.resx @@ -117,13 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - (UTC) Coordinated Universal Time - - - (UTC-05:00) Eastern Time (US & Canada) - - - (UTC-08:00) Pacific Time (US & Canada) - \ No newline at end of file diff --git a/Oqtane.Client/Services/TimeZoneService.cs b/Oqtane.Client/Services/TimeZoneService.cs index f6cab35b..753e455b 100644 --- a/Oqtane.Client/Services/TimeZoneService.cs +++ b/Oqtane.Client/Services/TimeZoneService.cs @@ -1,9 +1,11 @@ +using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Localization; +using NodaTime.TimeZones; +using NodaTime; using Oqtane.Documentation; -using Oqtane.Models; -using Oqtane.Shared; +using NodaTime.Extensions; namespace Oqtane.Services { @@ -17,18 +19,36 @@ namespace Oqtane.Services _TimeZoneLocalizer = TimeZoneLocalizer; } - public List GetTimeZones() + public List GetTimeZones() { - var _timezones = new List(); - foreach (var timezone in Utilities.GetTimeZones()) + var timezones = new List(); + + foreach (var tz in DateTimeZoneProviders.Tzdb.GetAllZones() + // only include timezones which have a country code defined or are US timezones + .Where(item => !string.IsNullOrEmpty(TzdbDateTimeZoneSource.Default.ZoneLocations.FirstOrDefault(l => l.ZoneId == item.Id)?.CountryCode) || item.Id.ToLower().Contains("us/")) + // order by UTC offset (ie. -11:00 to +14:00) + .OrderBy(item => item.GetUtcOffset(Instant.FromDateTimeUtc(DateTime.UtcNow)).Ticks)) { - _timezones.Add(new TimeZone + // get localized display name + var displayname = _TimeZoneLocalizer[tz.Id].Value; + if (displayname == tz.Id) { - Id = timezone.Id, - DisplayName = _TimeZoneLocalizer[timezone.Id] + // use default "friendly" display format + displayname = displayname.Replace("_", " ").Replace("/", " / "); + } + + // include offset prefix + var offset = tz.GetUtcOffset(Instant.FromDateTimeUtc(DateTime.UtcNow)).Ticks; + displayname = "(UTC" + (offset >= 0 ? "+" : "-") + new DateTime(Math.Abs(offset)).ToString("HH:mm") + ") " + displayname; + + timezones.Add(new Models.TimeZone() + { + Id = tz.Id, + DisplayName = displayname }); } - return _timezones.OrderBy(item => item.DisplayName).ToList(); + + return timezones; } } }