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;
}
}
}