[BUG] TimeZoneInfo.FindSystemTimeZoneById Issue On WebAssembly
Oqtane Info
Version - 6.1.3 Render Mode - Static/Interactive Interactivity - WebAssembly Database - SQL Server
Describe the bug
Navigate to Admin Dashboard / Site Settings. An exception will be thrown:
System.TimeZoneNotFoundException: The time zone ID 'xxx' was not found on the local computer. ---> System.TimeZoneNotFoundException: The time zone ID 'xxx' is invalid.
Expected Behavior
Steps To Reproduce
Anything else?
@sbwalker I have developed a custom timezone solution for my project so I can give you additional insights on the issues I encountered.
Basically, the issue comes from the differences between render modes, i.e. the machine where the app is running.
In Interactive with WebAssembly, the list of available timezones comes from the browser itself and the timezone database from IANA, so the id uses the official format.
You can check if the id is in iana format with: timezone.HasIanaId
However, in WebAssembly, you can't convert from IanaId to WindowsId with the methods provided in .NET: TimeZoneInfo.TryConvertIanaIdToWindowsId(timezone.Id, out var windowsId)
This is an example of timezones in WebAssembly:
On the other side, in Interactive Server or Static render modes, the list of timezones comes from the host machine, so it's highly dependent on the environment (i.e. Azure, AWS, VM, App Service, Windows, Linux, ...) and not comprehensive.
In this case, you might be able to convert to IanaId: TimeZoneInfo.TryConvertWindowsIdToIanaId(timezone.Id, out var ianaId)
This is an example in my development machine:
`
Therefore, the error you described probably comes from any of the methods in ModuleBase that perform timezone conversions:
public DateTime? UtcToLocal(DateTime? datetime)
{
TimeZoneInfo timezone = null;
if (PageState.User != null && !string.IsNullOrEmpty(PageState.User.TimeZoneId))
{
timezone = TimeZoneInfo.FindSystemTimeZoneById(PageState.User.TimeZoneId);
}
else if (!string.IsNullOrEmpty(PageState.Site.TimeZoneId))
{
timezone = TimeZoneInfo.FindSystemTimeZoneById(PageState.Site.TimeZoneId);
}
return Utilities.UtcAsLocalDateTime(datetime, timezone);
}
The TimeZoneId stored in PageState.User or PageState.Site is in Windows format, but the FindSystemTimeZoneById method in WebAssembly only accepts IANA format.
You could either store all the timezone ids in IANA format by using the method "TimeZoneInfo.TryConvertWindowsIdToIanaId", or perform all conversions server-side, which would imply too many http requests.
Even with this approach, there are timezones in Windows format with no IANA equivalent so it's still problematic:
Additionally, the list in server-side is not comprehensive at all, with only 141 timezones vs the 313 in client-side, so you might not able to cover all user needs.
I know you don't want to add additional dependencies to Oqtane, but because all of this problems, I developed my solution using NodaTime, which has an Apache 2.0 license and includes the complete tzdb (afaik it's the only .net solution that offers the tzdb with an open source license, other compilers).
Note that I included the NodaTime package in both client and server projects, so the timezone list is available in all render modes without the need to make requests to the server to retrieve it.
Here's a part of my implementation of a TimeZone service using NodaTime:
internal sealed class TimezoneService : ITimezoneService, ITransientService
{
public DateTimeOffset ConvertToLocalTimeFromUtc(DateTimeOffset dateTimeOffset, string timezoneId)
{
return ConvertToLocalTimeFromUtc(dateTimeOffset.UtcDateTime, timezoneId);
}
public DateTimeOffset ConvertToLocalTimeFromUtc(DateTime dateTime, string timezoneId)
{
if (dateTime == DateTime.MinValue) return DateTimeOffset.MinValue;
var timezone = DateTimeZoneProviders.Tzdb[timezoneId];
var instant = Instant.FromDateTimeUtc(dateTime.ToUniversalTime());
var zonedDateTime = instant.InZone(timezone);
return zonedDateTime.ToDateTimeOffset();
}
public DateTimeOffset ConvertToUtcFromLocalTime(DateTime dateTime, string timezoneId)
{
if (dateTime == DateTime.MinValue) return DateTimeOffset.MinValue;
var timezone = DateTimeZoneProviders.Tzdb[timezoneId];
var localDateTime = LocalDateTime.FromDateTime(dateTime);
var zonedDateTime = timezone.AtLeniently(localDateTime);
return new DateTimeOffset(zonedDateTime.ToDateTimeUtc(), TimeSpan.Zero);
}
public DateTimeOffset ConvertToUtcFromLocalTime(DateTimeOffset dateTimeOffset, string timezoneId)
{
return ConvertToUtcFromLocalTime(dateTimeOffset.DateTime, timezoneId);
}
public DateTime ConvertBetweenTimezones(DateTime dateTime, string sourceTimezoneId, string targetTimezoneId)
{
if (dateTime == DateTime.MinValue) return DateTime.MinValue;
var sourceTimezone = DateTimeZoneProviders.Tzdb[sourceTimezoneId];
var targetTimezone = DateTimeZoneProviders.Tzdb[targetTimezoneId];
var sourceLocalDateTime = LocalDateTime.FromDateTime(dateTime);
var sourceZonedDateTime = sourceTimezone.AtLeniently(sourceLocalDateTime);
var targetZonedDateTime = sourceZonedDateTime.WithZone(targetTimezone);
return targetZonedDateTime.ToDateTimeUnspecified();
}
public Dictionary<string, string> GetTimezones()
{
var timezoneIds = DateTimeZoneProviders.Tzdb.Ids;
var timezonesDictionary = new Dictionary<string, string>();
foreach (var timezoneId in timezoneIds)
{
var timezone = DateTimeZoneProviders.Tzdb[timezoneId];
if (timezone is null)
{
continue;
}
timezonesDictionary.Add(timezoneId, timezone.ToString());
}
return timezonesDictionary;
}
}
I hope this is helpful to you.
@sbwalker Local and Server 6.1.3 i have had no issue, loading settings and changing/saving timezone.
Maybe this is an isolated incident ?
@leigh-pointer it is only an issue when Interactivity is set to Client (WebAssembly) AND you have set a time zone for a Site or User.
@mdmontesinos I was under the impression that Microsoft had addressed the limitations in TimeZoneInfo in .NET 6:
https://devblogs.microsoft.com/dotnet/date-time-and-time-zone-enhancements-in-net-6/#time-zone-conversion-apis
But it does not appear to be the case for WebAssembly
I tried but can't reproduce it:
@zyhfish very strange, becasuse i confirmed with @sbwalker that I got the same error. What could be different ?
I'm using .net core 9.0.4, could that be a possible reason?
@zyhfish im using 9.0.5
I upgraded to 9.0.5 and still works fine.
@zyhfish the reason you are not able to reproduce this in the Dev branch is because I merged PR #5351 which adds exception handling to the date conversion methods. You can still reproduce the issue by setting the Time Zone for a site to something different than your local time zone, ensure you have Interactivity set to Client (WebAssembly), and then browse to any Admin UI where a date is displayed (ie. Event Log) and you will notice that the dates are NOT displayed in the time zone specified. This is because when running on WebAssembly the call to FindSystemTimeZoneById() is throwing an exception rather than returning a valid time zone.
Hi @sbwalker , thanks so much for the clarify, I tried to search and the root cause is: Blazor Server runs on the server, using .NET's server-side TimeZoneInfo IDs (usually Windows time zone IDs). Blazor WASM runs in the browser, using the user's device/browser settings and JS APIs, which typically work with IANA time zone IDs (like "America/New_York", "Asia/Shanghai").
we may able to resolve the issue with one of below options:
- use TimeZoneInfo.GetSystemTimeZones instead of TimeZoneService to provide the time zone list for edit, so that it can get IANA format IDs when running with web assembly mode;
- we can reference https://www.nuget.org/packages/TimeZoneConverter to convert the ID to same format between the render modes.
@zyhfish yes @mdmontesinos already outlined the root cause and a number of solutions earlier in this thread. It appears that although Microsoft said they "fixed" TimeZoneInfo in .NET 6, they did not address the underlying problem that the list of time zones is not consistent from platform to platform or even from installation to installation. For this reason, the only viable solution is to insulate the application from platform inconsistencies by providing a constant list of time zones which can be referenced on both the client and server regardless of run-time environment. The question is whether integrating a third party dependency to achieve this goal is necessary or not. The use case in Oqtane is fairly narrow: all dates must be stored in UTC format in the database, so the only requirement is to convert UTC dates to/from local time in the UI. It seems that NodaTime has a lot of adoption and is well maintained (and has no dependencies), so I am leaning towards @mdmontesinos's recommendation to use it in Oqtane.
@mdmontesinos do you want to submit a PR to integrate Nodatime:
- list of time zones a user can select should be based on IANA format (retrieved client-side - no need for TimeZone API)
- time zone value stored in database should be in IANA format (don't bother converting any existing values - we can reset the Site/User TimeZone field in the database to an empty string on upgrade)
- time zone conversion (use existing UtcToLocal and LocalToUTC methods in ModuleBase)
@sbwalker Sure, I can submit a PR. The reason for the TimeZone API in the implementation I showed is to increase maintainability in case I wanted to switch Nodatime, basically using an abstraction
@sbwalker Submitted the PR (#5387)
@mdmontesinos I have finally had time to test the NodaTime changes and unfortunately the results are still not optimal. Specifically, the list of time zones which NodaTime offers are not user friendly:
I personally spent a large amount of time scrolling through the list above trying to figure what time zone I should select for my region. This will be totally unacceptable for the majority of users.
Most applications provide a list of time zones with friendly names and UTC offset identifiers to help users quickly identify their time zone. The list below is from an Oqtane 6.1.3 installation:
If we take a step back to the original issue which we are trying to address, it is the cross platform resolution of time zones in order to convert UTC dates into a user's time zone ("cross platform" does not only refer to Windows/Linux/Mac running on the server but also refers to WebAssembly running in the client browser).
So if I restate the requirements:
- The list of time zones displayed in the UI need to be user friendly and include the UTC offset value for reference. The list should be sorted by UTC offset to help users identify their time zone.
- Time Zone IDs should be stored in a consistent format regardless of the platform (IANA ID is the international standard)
- Dates should always be stored in UTC format in the database and be converted in the UI using the Time Zone ID
For Requirement 1:
- TimeZoneInfo.GetSystemTimeZones() returns DisplayNames which are user friendly (at least on Windows - I am not sure what it returns on Linux/Mac)
- NodaTime does not return user friendly time zone names
- TimeZoneNames (https://github.com/mattjohnsonpint/TimeZoneNames) can be used to get user friendly time zone names (including localized friendly names)
For Requirement 2:
- TimeZoneInfo.GetSystemTimeZones() only returns IANA ID on Linux and Mac - it returns a Windows Time Zone ID when running on Windows
- NodaTime can be used to get IANA ID
- TimeZoneConverter (https://github.com/mattjohnsonpint/TimeZoneConverter) can be used to get IANA ID
For Requirement 3:
- TimeZoneInfo was changed in .NET 6 so that FindSystemTimeZoneById() should handle IANA IDs but it has known issues on some Windows operating systems (see https://github.com/dotnet/runtime/issues/62329)
- NodaTime can translate IANA ID to time zone
-
- TimeZoneConverter (https://github.com/mattjohnsonpint/TimeZoneConverter) can translate IANA ID to time zone
It is clear that there is no single solution above which satisfies all of the requirements - so a combination of solutions is needed. So the question is what is the right combination? Perhaps TimeZoneNames (as it includes TimeZoneConverter) would be better than using NodaTime.
@sbwalker You're absolutely right that the result is not truly user-friendly.
As for the solutions you mentioned, TimeZoneConverter is more limited than NodaTime and still has OS dependencies:
Perhaps we might not need the functions that have OS dependencies, but still, it's possible that some people encounter issues depending on their infrastructure, which is not the case with NodaTime.
And also, it should be noted that NodaTime does provide Timezone conversions to/from UTC, which TimeZoneConverter does not, so we would again rely on .net conversions.
Additionally, after testing I discovered another issue in the TZ list displayed for the user.
When the list comes exclusively from TZNames.GetDisplayNames("en-US", useIanaZoneIds: true), the list is user friendly but not totally comprehensive. For example, my tz (Europe/Madrid) is not really listed, but gathered under <option value="Europe/Paris">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>. However, this would not match the timezone returned by the JS api in the browser, which might be problematic in some cases (i.e. when auto selecting the timezone from the user browser, which is what I do in my modules).
Also, I'm not sure if this still has OS dependencies due to some info in the library repository:
"
"
Here's the complete list returned in this case:
<select id="timezone" class="form-select">
<option value=""><Not Specified></option>
<option value="Etc/GMT+12">(UTC-12:00) International Date Line West</option>
<option value="Etc/GMT+11">(UTC-11:00) Coordinated Universal Time-11</option>
<option value="America/Adak">(UTC-10:00) Aleutian Islands</option>
<option value="Pacific/Honolulu">(UTC-10:00) Hawaii</option>
<option value="Pacific/Marquesas">(UTC-09:30) Marquesas Islands</option>
<option value="America/Anchorage">(UTC-09:00) Alaska</option>
<option value="Etc/GMT+9">(UTC-09:00) Coordinated Universal Time-09</option>
<option value="America/Tijuana">(UTC-08:00) Baja California</option>
<option value="Etc/GMT+8">(UTC-08:00) Coordinated Universal Time-08</option>
<option value="America/Los_Angeles">(UTC-08:00) Pacific Time (US & Canada)</option>
<option value="America/Phoenix">(UTC-07:00) Arizona</option>
<option value="America/Mazatlan">(UTC-07:00) La Paz, Mazatlan</option>
<option value="America/Denver">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="America/Whitehorse">(UTC-07:00) Yukon</option>
<option value="America/Guatemala">(UTC-06:00) Central America</option>
<option value="America/Chicago">(UTC-06:00) Central Time (US & Canada)</option>
<option value="Pacific/Easter">(UTC-06:00) Easter Island</option>
<option value="America/Mexico_City">(UTC-06:00) Guadalajara, Mexico City, Monterrey</option>
<option value="America/Regina">(UTC-06:00) Saskatchewan</option>
<option value="America/Bogota">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Cancun">(UTC-05:00) Chetumal</option>
<option value="America/New_York">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Port-au-Prince">(UTC-05:00) Haiti</option>
<option value="America/Havana">(UTC-05:00) Havana</option>
<option value="America/Indiana/Indianapolis">(UTC-05:00) Indiana (East)</option>
<option value="America/Grand_Turk">(UTC-05:00) Turks and Caicos</option>
<option value="America/Asuncion">(UTC-04:00) Asuncion</option>
<option value="America/Halifax">(UTC-04:00) Atlantic Time (Canada)</option>
<option value="America/Caracas">(UTC-04:00) Caracas</option>
<option value="America/Cuiaba">(UTC-04:00) Cuiaba</option>
<option value="America/La_Paz">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Santiago">(UTC-04:00) Santiago</option>
<option value="America/St_Johns">(UTC-03:30) Newfoundland</option>
<option value="America/Araguaina">(UTC-03:00) Araguaina</option>
<option value="America/Sao_Paulo">(UTC-03:00) Brasilia</option>
<option value="America/Cayenne">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="America/Argentina/Buenos_Aires">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Montevideo">(UTC-03:00) Montevideo</option>
<option value="America/Punta_Arenas">(UTC-03:00) Punta Arenas</option>
<option value="America/Miquelon">(UTC-03:00) Saint Pierre and Miquelon</option>
<option value="America/Bahia">(UTC-03:00) Salvador</option>
<option value="Etc/GMT+2">(UTC-02:00) Coordinated Universal Time-02</option>
<option value="America/Nuuk">(UTC-02:00) Greenland</option>
<option value="Atlantic/Azores">(UTC-01:00) Azores</option>
<option value="Atlantic/Cape_Verde">(UTC-01:00) Cabo Verde Is.</option>
<option value="Etc/UTC">(UTC) Coordinated Universal Time</option>
<option value="Europe/London">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Africa/Abidjan">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Sao_Tome">(UTC+00:00) Sao Tome</option>
<option value="Africa/Casablanca">(UTC+01:00) Casablanca</option>
<option value="Europe/Berlin">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Budapest">(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
<option value="Europe/Paris">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="Europe/Warsaw">(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb</option>
<option value="Africa/Lagos">(UTC+01:00) West Central Africa</option>
<option value="Europe/Bucharest">(UTC+02:00) Athens, Bucharest</option>
<option value="Asia/Beirut">(UTC+02:00) Beirut</option>
<option value="Africa/Cairo">(UTC+02:00) Cairo</option>
<option value="Europe/Chisinau">(UTC+02:00) Chisinau</option>
<option value="Asia/Hebron">(UTC+02:00) Gaza, Hebron</option>
<option value="Africa/Johannesburg">(UTC+02:00) Harare, Pretoria</option>
<option value="Europe/Kyiv">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Asia/Jerusalem">(UTC+02:00) Jerusalem</option>
<option value="Africa/Juba">(UTC+02:00) Juba</option>
<option value="Europe/Kaliningrad">(UTC+02:00) Kaliningrad</option>
<option value="Africa/Khartoum">(UTC+02:00) Khartoum</option>
<option value="Africa/Tripoli">(UTC+02:00) Tripoli</option>
<option value="Africa/Windhoek">(UTC+02:00) Windhoek</option>
<option value="Asia/Amman">(UTC+03:00) Amman</option>
<option value="Asia/Baghdad">(UTC+03:00) Baghdad</option>
<option value="Asia/Damascus">(UTC+03:00) Damascus</option>
<option value="Europe/Istanbul">(UTC+03:00) Istanbul</option>
<option value="Asia/Riyadh">(UTC+03:00) Kuwait, Riyadh</option>
<option value="Europe/Minsk">(UTC+03:00) Minsk</option>
<option value="Europe/Moscow">(UTC+03:00) Moscow, St. Petersburg</option>
<option value="Africa/Nairobi">(UTC+03:00) Nairobi</option>
<option value="Europe/Volgograd">(UTC+03:00) Volgograd</option>
<option value="Asia/Tehran">(UTC+03:30) Tehran</option>
<option value="Asia/Dubai">(UTC+04:00) Abu Dhabi, Muscat</option>
<option value="Europe/Astrakhan">(UTC+04:00) Astrakhan, Ulyanovsk</option>
<option value="Asia/Baku">(UTC+04:00) Baku</option>
<option value="Europe/Samara">(UTC+04:00) Izhevsk, Samara</option>
<option value="Indian/Mauritius">(UTC+04:00) Port Louis</option>
<option value="Europe/Saratov">(UTC+04:00) Saratov</option>
<option value="Asia/Tbilisi">(UTC+04:00) Tbilisi</option>
<option value="Asia/Yerevan">(UTC+04:00) Yerevan</option>
<option value="Asia/Kabul">(UTC+04:30) Kabul</option>
<option value="Asia/Tashkent">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Qyzylorda">(UTC+05:00) Astana</option>
<option value="Asia/Yekaterinburg">(UTC+05:00) Ekaterinburg</option>
<option value="Asia/Karachi">(UTC+05:00) Islamabad, Karachi</option>
<option value="Asia/Kolkata">(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi</option>
<option value="Asia/Colombo">(UTC+05:30) Sri Jayawardenepura</option>
<option value="Asia/Kathmandu">(UTC+05:45) Kathmandu</option>
<option value="Asia/Bishkek">(UTC+06:00) Bishkek</option>
<option value="Asia/Dhaka">(UTC+06:00) Dhaka</option>
<option value="Asia/Omsk">(UTC+06:00) Omsk</option>
<option value="Asia/Yangon">(UTC+06:30) Yangon (Rangoon)</option>
<option value="Asia/Bangkok">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Asia/Barnaul">(UTC+07:00) Barnaul, Gorno-Altaysk</option>
<option value="Asia/Hovd">(UTC+07:00) Hovd</option>
<option value="Asia/Krasnoyarsk">(UTC+07:00) Krasnoyarsk</option>
<option value="Asia/Novosibirsk">(UTC+07:00) Novosibirsk</option>
<option value="Asia/Tomsk">(UTC+07:00) Tomsk</option>
<option value="Asia/Shanghai">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Asia/Irkutsk">(UTC+08:00) Irkutsk</option>
<option value="Asia/Singapore">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Australia/Perth">(UTC+08:00) Perth</option>
<option value="Asia/Taipei">(UTC+08:00) Taipei</option>
<option value="Asia/Ulaanbaatar">(UTC+08:00) Ulaanbaatar</option>
<option value="Australia/Eucla">(UTC+08:45) Eucla</option>
<option value="Asia/Chita">(UTC+09:00) Chita</option>
<option value="Asia/Tokyo">(UTC+09:00) Osaka, Sapporo, Tokyo</option>
<option value="Asia/Pyongyang">(UTC+09:00) Pyongyang</option>
<option value="Asia/Seoul">(UTC+09:00) Seoul</option>
<option value="Asia/Yakutsk">(UTC+09:00) Yakutsk</option>
<option value="Australia/Adelaide">(UTC+09:30) Adelaide</option>
<option value="Australia/Darwin">(UTC+09:30) Darwin</option>
<option value="Australia/Brisbane">(UTC+10:00) Brisbane</option>
<option value="Australia/Sydney">(UTC+10:00) Canberra, Melbourne, Sydney</option>
<option value="Pacific/Port_Moresby">(UTC+10:00) Guam, Port Moresby</option>
<option value="Australia/Hobart">(UTC+10:00) Hobart</option>
<option value="Asia/Vladivostok">(UTC+10:00) Vladivostok</option>
<option value="Australia/Lord_Howe">(UTC+10:30) Lord Howe Island</option>
<option value="Pacific/Bougainville">(UTC+11:00) Bougainville Island</option>
<option value="Asia/Srednekolymsk">(UTC+11:00) Chokurdakh</option>
<option value="Asia/Magadan">(UTC+11:00) Magadan</option>
<option value="Pacific/Norfolk">(UTC+11:00) Norfolk Island</option>
<option value="Asia/Sakhalin">(UTC+11:00) Sakhalin</option>
<option value="Pacific/Guadalcanal">(UTC+11:00) Solomon Is., New Caledonia</option>
<option value="Asia/Kamchatka">(UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky</option>
<option value="Pacific/Auckland">(UTC+12:00) Auckland, Wellington</option>
<option value="Etc/GMT-12">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Pacific/Fiji">(UTC+12:00) Fiji</option>
<option value="Pacific/Chatham">(UTC+12:45) Chatham Islands</option>
<option value="Etc/GMT-13">(UTC+13:00) Coordinated Universal Time+13</option>
<option value="Pacific/Tongatapu">(UTC+13:00) Nuku'alofa</option>
<option value="Pacific/Apia">(UTC+13:00) Samoa</option>
<option value="Pacific/Kiritimati">(UTC+14:00) Kiritimati Island</option>
</select>
On the other hand, if we want to use NodaTime to provide a comprehensive list of all the timezones in the TZDB, and use the display name provided by TZNames, we end up with duplicate display names for different IANA ids:
<option value="Europe/Madrid">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="Europe/Paris">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
This is the complete list:
<select id="timezone" class="form-select">
<option value=""><Not Specified></option>
<option value="Africa/Abidjan">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Accra">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Addis_Ababa">(UTC+03:00) Nairobi</option>
<option value="Africa/Algiers">(UTC+01:00) West Central Africa</option>
<option value="Africa/Asmara">(UTC+03:00) Nairobi</option>
<option value="Africa/Asmera">(UTC+03:00) Nairobi</option>
<option value="Africa/Bamako">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Bangui">(UTC+01:00) West Central Africa</option>
<option value="Africa/Banjul">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Bissau">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Blantyre">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Brazzaville">(UTC+01:00) West Central Africa</option>
<option value="Africa/Bujumbura">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Cairo">(UTC+02:00) Cairo</option>
<option value="Africa/Casablanca">(UTC+01:00) Casablanca</option>
<option value="Africa/Ceuta">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="Africa/Conakry">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Dakar">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Dar_es_Salaam">(UTC+03:00) Nairobi</option>
<option value="Africa/Djibouti">(UTC+03:00) Nairobi</option>
<option value="Africa/Douala">(UTC+01:00) West Central Africa</option>
<option value="Africa/El_Aaiun">(UTC+01:00) Casablanca</option>
<option value="Africa/Freetown">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Gaborone">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Harare">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Johannesburg">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Juba">(UTC+02:00) Juba</option>
<option value="Africa/Kampala">(UTC+03:00) Nairobi</option>
<option value="Africa/Khartoum">(UTC+02:00) Khartoum</option>
<option value="Africa/Kigali">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Kinshasa">(UTC+01:00) West Central Africa</option>
<option value="Africa/Lagos">(UTC+01:00) West Central Africa</option>
<option value="Africa/Libreville">(UTC+01:00) West Central Africa</option>
<option value="Africa/Lome">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Luanda">(UTC+01:00) West Central Africa</option>
<option value="Africa/Lubumbashi">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Lusaka">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Malabo">(UTC+01:00) West Central Africa</option>
<option value="Africa/Maputo">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Maseru">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Mbabane">(UTC+02:00) Harare, Pretoria</option>
<option value="Africa/Mogadishu">(UTC+03:00) Nairobi</option>
<option value="Africa/Monrovia">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Nairobi">(UTC+03:00) Nairobi</option>
<option value="Africa/Ndjamena">(UTC+01:00) West Central Africa</option>
<option value="Africa/Niamey">(UTC+01:00) West Central Africa</option>
<option value="Africa/Nouakchott">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Ouagadougou">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Porto-Novo">(UTC+01:00) West Central Africa</option>
<option value="Africa/Sao_Tome">(UTC+00:00) Sao Tome</option>
<option value="Africa/Timbuktu">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Africa/Tripoli">(UTC+02:00) Tripoli</option>
<option value="Africa/Tunis">(UTC+01:00) West Central Africa</option>
<option value="Africa/Windhoek">(UTC+02:00) Windhoek</option>
<option value="America/Adak">(UTC-10:00) Aleutian Islands</option>
<option value="America/Anchorage">(UTC-09:00) Alaska</option>
<option value="America/Anguilla">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Antigua">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Araguaina">(UTC-03:00) Araguaina</option>
<option value="America/Argentina/Buenos_Aires">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/Catamarca">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/ComodRivadavia">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/Cordoba">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/Jujuy">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/La_Rioja">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/Mendoza">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/Rio_Gallegos">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/Salta">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/San_Juan">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/San_Luis">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/Tucuman">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Argentina/Ushuaia">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Aruba">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Asuncion">(UTC-04:00) Asuncion</option>
<option value="America/Atikokan">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Atka">(UTC-10:00) Aleutian Islands</option>
<option value="America/Bahia">(UTC-03:00) Salvador</option>
<option value="America/Bahia_Banderas">(UTC-06:00) Guadalajara, Mexico City, Monterrey</option>
<option value="America/Barbados">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Belem">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="America/Belize">(UTC-06:00) Central America</option>
<option value="America/Blanc-Sablon">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Boa_Vista">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Bogota">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Boise">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="America/Buenos_Aires">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Cambridge_Bay">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="America/Campo_Grande">(UTC-04:00) Cuiaba</option>
<option value="America/Cancun">(UTC-05:00) Chetumal</option>
<option value="America/Caracas">(UTC-04:00) Caracas</option>
<option value="America/Catamarca">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Cayenne">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="America/Cayman">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Chicago">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Chihuahua">(UTC-06:00) Guadalajara, Mexico City, Monterrey</option>
<option value="America/Ciudad_Juarez">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="America/Coral_Harbour">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Cordoba">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Costa_Rica">(UTC-06:00) Central America</option>
<option value="America/Coyhaique"></option>
<option value="America/Creston">(UTC-07:00) Arizona</option>
<option value="America/Cuiaba">(UTC-04:00) Cuiaba</option>
<option value="America/Curacao">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Danmarkshavn">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="America/Dawson">(UTC-07:00) Yukon</option>
<option value="America/Dawson_Creek">(UTC-07:00) Arizona</option>
<option value="America/Denver">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="America/Detroit">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Dominica">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Edmonton">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="America/Eirunepe">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/El_Salvador">(UTC-06:00) Central America</option>
<option value="America/Ensenada">(UTC-08:00) Baja California</option>
<option value="America/Fort_Nelson">(UTC-07:00) Arizona</option>
<option value="America/Fort_Wayne">(UTC-05:00) Indiana (East)</option>
<option value="America/Fortaleza">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="America/Glace_Bay">(UTC-04:00) Atlantic Time (Canada)</option>
<option value="America/Godthab">(UTC-02:00) Greenland</option>
<option value="America/Goose_Bay">(UTC-04:00) Atlantic Time (Canada)</option>
<option value="America/Grand_Turk">(UTC-05:00) Turks and Caicos</option>
<option value="America/Grenada">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Guadeloupe">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Guatemala">(UTC-06:00) Central America</option>
<option value="America/Guayaquil">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Guyana">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Halifax">(UTC-04:00) Atlantic Time (Canada)</option>
<option value="America/Havana">(UTC-05:00) Havana</option>
<option value="America/Hermosillo">(UTC-07:00) Arizona</option>
<option value="America/Indiana/Indianapolis">(UTC-05:00) Indiana (East)</option>
<option value="America/Indiana/Knox">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Indiana/Marengo">(UTC-05:00) Indiana (East)</option>
<option value="America/Indiana/Petersburg">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Indiana/Tell_City">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Indiana/Vevay">(UTC-05:00) Indiana (East)</option>
<option value="America/Indiana/Vincennes">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Indiana/Winamac">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Indianapolis">(UTC-05:00) Indiana (East)</option>
<option value="America/Inuvik">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="America/Iqaluit">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Jamaica">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Jujuy">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Juneau">(UTC-09:00) Alaska</option>
<option value="America/Kentucky/Louisville">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Kentucky/Monticello">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Knox_IN">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Kralendijk">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/La_Paz">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Lima">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Los_Angeles">(UTC-08:00) Pacific Time (US & Canada)</option>
<option value="America/Louisville">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Lower_Princes">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Maceio">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="America/Managua">(UTC-06:00) Central America</option>
<option value="America/Manaus">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Marigot">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Martinique">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Matamoros">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Mazatlan">(UTC-07:00) La Paz, Mazatlan</option>
<option value="America/Mendoza">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Menominee">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Merida">(UTC-06:00) Guadalajara, Mexico City, Monterrey</option>
<option value="America/Metlakatla">(UTC-09:00) Alaska</option>
<option value="America/Mexico_City">(UTC-06:00) Guadalajara, Mexico City, Monterrey</option>
<option value="America/Miquelon">(UTC-03:00) Saint Pierre and Miquelon</option>
<option value="America/Moncton">(UTC-04:00) Atlantic Time (Canada)</option>
<option value="America/Monterrey">(UTC-06:00) Guadalajara, Mexico City, Monterrey</option>
<option value="America/Montevideo">(UTC-03:00) Montevideo</option>
<option value="America/Montreal">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Montserrat">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Nassau">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/New_York">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Nipigon">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Nome">(UTC-09:00) Alaska</option>
<option value="America/Noronha">(UTC-02:00) Coordinated Universal Time-02</option>
<option value="America/North_Dakota/Beulah">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/North_Dakota/Center">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/North_Dakota/New_Salem">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Nuuk">(UTC-02:00) Greenland</option>
<option value="America/Ojinaga">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Panama">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Pangnirtung">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Paramaribo">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="America/Phoenix">(UTC-07:00) Arizona</option>
<option value="America/Port-au-Prince">(UTC-05:00) Haiti</option>
<option value="America/Port_of_Spain">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Porto_Acre">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Porto_Velho">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Puerto_Rico">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Punta_Arenas">(UTC-03:00) Punta Arenas</option>
<option value="America/Rainy_River">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Rankin_Inlet">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Recife">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="America/Regina">(UTC-06:00) Saskatchewan</option>
<option value="America/Resolute">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Rio_Branco">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Rosario">(UTC-03:00) City of Buenos Aires</option>
<option value="America/Santa_Isabel">(UTC-08:00) Baja California</option>
<option value="America/Santarem">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="America/Santiago">(UTC-04:00) Santiago</option>
<option value="America/Santo_Domingo">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Sao_Paulo">(UTC-03:00) Brasilia</option>
<option value="America/Scoresbysund">(UTC-01:00) Azores</option>
<option value="America/Shiprock">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="America/Sitka">(UTC-09:00) Alaska</option>
<option value="America/St_Barthelemy">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/St_Johns">(UTC-03:30) Newfoundland</option>
<option value="America/St_Kitts">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/St_Lucia">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/St_Thomas">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/St_Vincent">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Swift_Current">(UTC-06:00) Saskatchewan</option>
<option value="America/Tegucigalpa">(UTC-06:00) Central America</option>
<option value="America/Thule">(UTC-04:00) Atlantic Time (Canada)</option>
<option value="America/Thunder_Bay">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Tijuana">(UTC-08:00) Baja California</option>
<option value="America/Toronto">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="America/Tortola">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Vancouver">(UTC-08:00) Pacific Time (US & Canada)</option>
<option value="America/Virgin">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="America/Whitehorse">(UTC-07:00) Yukon</option>
<option value="America/Winnipeg">(UTC-06:00) Central Time (US & Canada)</option>
<option value="America/Yakutat">(UTC-09:00) Alaska</option>
<option value="America/Yellowknife">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="Antarctica/Casey">(UTC+11:00) Solomon Is., New Caledonia</option>
<option value="Antarctica/Davis">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Antarctica/DumontDUrville">(UTC+10:00) Guam, Port Moresby</option>
<option value="Antarctica/Macquarie">(UTC+10:00) Hobart</option>
<option value="Antarctica/Mawson">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Antarctica/McMurdo">(UTC+12:00) Auckland, Wellington</option>
<option value="Antarctica/Palmer">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="Antarctica/Rothera">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="Antarctica/South_Pole">(UTC+12:00) Auckland, Wellington</option>
<option value="Antarctica/Syowa">(UTC+03:00) Nairobi</option>
<option value="Antarctica/Troll"></option>
<option value="Antarctica/Vostok">(UTC+06:00) Bishkek</option>
<option value="Arctic/Longyearbyen">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Asia/Aden">(UTC+03:00) Kuwait, Riyadh</option>
<option value="Asia/Almaty">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Amman">(UTC+03:00) Amman</option>
<option value="Asia/Anadyr">(UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky</option>
<option value="Asia/Aqtau">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Aqtobe">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Ashgabat">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Ashkhabad">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Atyrau">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Baghdad">(UTC+03:00) Baghdad</option>
<option value="Asia/Bahrain">(UTC+03:00) Kuwait, Riyadh</option>
<option value="Asia/Baku">(UTC+04:00) Baku</option>
<option value="Asia/Bangkok">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Asia/Barnaul">(UTC+07:00) Barnaul, Gorno-Altaysk</option>
<option value="Asia/Beirut">(UTC+02:00) Beirut</option>
<option value="Asia/Bishkek">(UTC+06:00) Bishkek</option>
<option value="Asia/Brunei">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Asia/Calcutta">(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi</option>
<option value="Asia/Chita">(UTC+09:00) Chita</option>
<option value="Asia/Choibalsan">(UTC+08:00) Ulaanbaatar</option>
<option value="Asia/Chongqing">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Asia/Chungking">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Asia/Colombo">(UTC+05:30) Sri Jayawardenepura</option>
<option value="Asia/Dacca">(UTC+06:00) Dhaka</option>
<option value="Asia/Damascus">(UTC+03:00) Damascus</option>
<option value="Asia/Dhaka">(UTC+06:00) Dhaka</option>
<option value="Asia/Dili">(UTC+09:00) Osaka, Sapporo, Tokyo</option>
<option value="Asia/Dubai">(UTC+04:00) Abu Dhabi, Muscat</option>
<option value="Asia/Dushanbe">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Famagusta">(UTC+02:00) Athens, Bucharest</option>
<option value="Asia/Gaza">(UTC+02:00) Gaza, Hebron</option>
<option value="Asia/Harbin">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Asia/Hebron">(UTC+02:00) Gaza, Hebron</option>
<option value="Asia/Ho_Chi_Minh">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Asia/Hong_Kong">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Asia/Hovd">(UTC+07:00) Hovd</option>
<option value="Asia/Irkutsk">(UTC+08:00) Irkutsk</option>
<option value="Asia/Istanbul">(UTC+03:00) Istanbul</option>
<option value="Asia/Jakarta">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Asia/Jayapura">(UTC+09:00) Osaka, Sapporo, Tokyo</option>
<option value="Asia/Jerusalem">(UTC+02:00) Jerusalem</option>
<option value="Asia/Kabul">(UTC+04:30) Kabul</option>
<option value="Asia/Kamchatka">(UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky</option>
<option value="Asia/Karachi">(UTC+05:00) Islamabad, Karachi</option>
<option value="Asia/Kashgar">(UTC+06:00) Bishkek</option>
<option value="Asia/Kathmandu">(UTC+05:45) Kathmandu</option>
<option value="Asia/Katmandu">(UTC+05:45) Kathmandu</option>
<option value="Asia/Khandyga">(UTC+09:00) Yakutsk</option>
<option value="Asia/Kolkata">(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi</option>
<option value="Asia/Krasnoyarsk">(UTC+07:00) Krasnoyarsk</option>
<option value="Asia/Kuala_Lumpur">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Asia/Kuching">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Asia/Kuwait">(UTC+03:00) Kuwait, Riyadh</option>
<option value="Asia/Macao">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Asia/Macau">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Asia/Magadan">(UTC+11:00) Magadan</option>
<option value="Asia/Makassar">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Asia/Manila">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Asia/Muscat">(UTC+04:00) Abu Dhabi, Muscat</option>
<option value="Asia/Nicosia">(UTC+02:00) Athens, Bucharest</option>
<option value="Asia/Novokuznetsk">(UTC+07:00) Krasnoyarsk</option>
<option value="Asia/Novosibirsk">(UTC+07:00) Novosibirsk</option>
<option value="Asia/Omsk">(UTC+06:00) Omsk</option>
<option value="Asia/Oral">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Phnom_Penh">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Asia/Pontianak">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Asia/Pyongyang">(UTC+09:00) Pyongyang</option>
<option value="Asia/Qatar">(UTC+03:00) Kuwait, Riyadh</option>
<option value="Asia/Qostanay">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Qyzylorda">(UTC+05:00) Astana</option>
<option value="Asia/Rangoon">(UTC+06:30) Yangon (Rangoon)</option>
<option value="Asia/Riyadh">(UTC+03:00) Kuwait, Riyadh</option>
<option value="Asia/Saigon">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Asia/Sakhalin">(UTC+11:00) Sakhalin</option>
<option value="Asia/Samarkand">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Seoul">(UTC+09:00) Seoul</option>
<option value="Asia/Shanghai">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Asia/Singapore">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Asia/Srednekolymsk">(UTC+11:00) Chokurdakh</option>
<option value="Asia/Taipei">(UTC+08:00) Taipei</option>
<option value="Asia/Tashkent">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Asia/Tbilisi">(UTC+04:00) Tbilisi</option>
<option value="Asia/Tehran">(UTC+03:30) Tehran</option>
<option value="Asia/Tel_Aviv">(UTC+02:00) Jerusalem</option>
<option value="Asia/Thimbu">(UTC+06:00) Dhaka</option>
<option value="Asia/Thimphu">(UTC+06:00) Dhaka</option>
<option value="Asia/Tokyo">(UTC+09:00) Osaka, Sapporo, Tokyo</option>
<option value="Asia/Tomsk">(UTC+07:00) Tomsk</option>
<option value="Asia/Ujung_Pandang">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Asia/Ulaanbaatar">(UTC+08:00) Ulaanbaatar</option>
<option value="Asia/Ulan_Bator">(UTC+08:00) Ulaanbaatar</option>
<option value="Asia/Urumqi">(UTC+06:00) Bishkek</option>
<option value="Asia/Ust-Nera">(UTC+10:00) Vladivostok</option>
<option value="Asia/Vientiane">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Asia/Vladivostok">(UTC+10:00) Vladivostok</option>
<option value="Asia/Yakutsk">(UTC+09:00) Yakutsk</option>
<option value="Asia/Yangon">(UTC+06:30) Yangon (Rangoon)</option>
<option value="Asia/Yekaterinburg">(UTC+05:00) Ekaterinburg</option>
<option value="Asia/Yerevan">(UTC+04:00) Yerevan</option>
<option value="Atlantic/Azores">(UTC-01:00) Azores</option>
<option value="Atlantic/Bermuda">(UTC-04:00) Atlantic Time (Canada)</option>
<option value="Atlantic/Canary">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Atlantic/Cape_Verde">(UTC-01:00) Cabo Verde Is.</option>
<option value="Atlantic/Faeroe">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Atlantic/Faroe">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Atlantic/Jan_Mayen">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Atlantic/Madeira">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Atlantic/Reykjavik">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Atlantic/South_Georgia">(UTC-02:00) Coordinated Universal Time-02</option>
<option value="Atlantic/St_Helena">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Atlantic/Stanley">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="Australia/ACT">(UTC+10:00) Canberra, Melbourne, Sydney</option>
<option value="Australia/Adelaide">(UTC+09:30) Adelaide</option>
<option value="Australia/Brisbane">(UTC+10:00) Brisbane</option>
<option value="Australia/Broken_Hill">(UTC+09:30) Adelaide</option>
<option value="Australia/Canberra">(UTC+10:00) Canberra, Melbourne, Sydney</option>
<option value="Australia/Currie">(UTC+10:00) Hobart</option>
<option value="Australia/Darwin">(UTC+09:30) Darwin</option>
<option value="Australia/Eucla">(UTC+08:45) Eucla</option>
<option value="Australia/Hobart">(UTC+10:00) Hobart</option>
<option value="Australia/LHI">(UTC+10:30) Lord Howe Island</option>
<option value="Australia/Lindeman">(UTC+10:00) Brisbane</option>
<option value="Australia/Lord_Howe">(UTC+10:30) Lord Howe Island</option>
<option value="Australia/Melbourne">(UTC+10:00) Canberra, Melbourne, Sydney</option>
<option value="Australia/NSW">(UTC+10:00) Canberra, Melbourne, Sydney</option>
<option value="Australia/North">(UTC+09:30) Darwin</option>
<option value="Australia/Perth">(UTC+08:00) Perth</option>
<option value="Australia/Queensland">(UTC+10:00) Brisbane</option>
<option value="Australia/South">(UTC+09:30) Adelaide</option>
<option value="Australia/Sydney">(UTC+10:00) Canberra, Melbourne, Sydney</option>
<option value="Australia/Tasmania">(UTC+10:00) Hobart</option>
<option value="Australia/Victoria">(UTC+10:00) Canberra, Melbourne, Sydney</option>
<option value="Australia/West">(UTC+08:00) Perth</option>
<option value="Australia/Yancowinna">(UTC+09:30) Adelaide</option>
<option value="Brazil/Acre">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="Brazil/DeNoronha">(UTC-02:00) Coordinated Universal Time-02</option>
<option value="Brazil/East">(UTC-03:00) Brasilia</option>
<option value="Brazil/West">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="CET">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="CST6CDT">(UTC-06:00) Central Time (US & Canada)</option>
<option value="Canada/Atlantic">(UTC-04:00) Atlantic Time (Canada)</option>
<option value="Canada/Central">(UTC-06:00) Central Time (US & Canada)</option>
<option value="Canada/Eastern">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="Canada/Mountain">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="Canada/Newfoundland">(UTC-03:30) Newfoundland</option>
<option value="Canada/Pacific">(UTC-08:00) Pacific Time (US & Canada)</option>
<option value="Canada/Saskatchewan">(UTC-06:00) Saskatchewan</option>
<option value="Canada/Yukon">(UTC-07:00) Yukon</option>
<option value="Chile/Continental">(UTC-04:00) Santiago</option>
<option value="Chile/EasterIsland">(UTC-06:00) Easter Island</option>
<option value="Cuba">(UTC-05:00) Havana</option>
<option value="EET">(UTC+02:00) Athens, Bucharest</option>
<option value="EST">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="EST5EDT">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="Egypt">(UTC+02:00) Cairo</option>
<option value="Eire">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Etc/GMT">(UTC) Coordinated Universal Time</option>
<option value="Etc/GMT+0">(UTC) Coordinated Universal Time</option>
<option value="Etc/GMT+1">(UTC-01:00) Cabo Verde Is.</option>
<option value="Etc/GMT+10">(UTC-10:00) Hawaii</option>
<option value="Etc/GMT+11">(UTC-11:00) Coordinated Universal Time-11</option>
<option value="Etc/GMT+12">(UTC-12:00) International Date Line West</option>
<option value="Etc/GMT+2">(UTC-02:00) Coordinated Universal Time-02</option>
<option value="Etc/GMT+3">(UTC-03:00) Cayenne, Fortaleza</option>
<option value="Etc/GMT+4">(UTC-04:00) Georgetown, La Paz, Manaus, San Juan</option>
<option value="Etc/GMT+5">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="Etc/GMT+6">(UTC-06:00) Central America</option>
<option value="Etc/GMT+7">(UTC-07:00) Arizona</option>
<option value="Etc/GMT+8">(UTC-08:00) Coordinated Universal Time-08</option>
<option value="Etc/GMT+9">(UTC-09:00) Coordinated Universal Time-09</option>
<option value="Etc/GMT-0">(UTC) Coordinated Universal Time</option>
<option value="Etc/GMT-1">(UTC+01:00) West Central Africa</option>
<option value="Etc/GMT-10">(UTC+10:00) Guam, Port Moresby</option>
<option value="Etc/GMT-11">(UTC+11:00) Solomon Is., New Caledonia</option>
<option value="Etc/GMT-12">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Etc/GMT-13">(UTC+13:00) Coordinated Universal Time+13</option>
<option value="Etc/GMT-14">(UTC+14:00) Kiritimati Island</option>
<option value="Etc/GMT-2">(UTC+02:00) Harare, Pretoria</option>
<option value="Etc/GMT-3">(UTC+03:00) Nairobi</option>
<option value="Etc/GMT-4">(UTC+04:00) Abu Dhabi, Muscat</option>
<option value="Etc/GMT-5">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Etc/GMT-6">(UTC+06:00) Bishkek</option>
<option value="Etc/GMT-7">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Etc/GMT-8">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Etc/GMT-9">(UTC+09:00) Osaka, Sapporo, Tokyo</option>
<option value="Etc/GMT0">(UTC) Coordinated Universal Time</option>
<option value="Etc/Greenwich">(UTC) Coordinated Universal Time</option>
<option value="Etc/UCT">(UTC) Coordinated Universal Time</option>
<option value="Etc/UTC">(UTC) Coordinated Universal Time</option>
<option value="Etc/Universal">(UTC) Coordinated Universal Time</option>
<option value="Etc/Zulu">(UTC) Coordinated Universal Time</option>
<option value="Europe/Amsterdam">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Andorra">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Astrakhan">(UTC+04:00) Astrakhan, Ulyanovsk</option>
<option value="Europe/Athens">(UTC+02:00) Athens, Bucharest</option>
<option value="Europe/Belfast">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Europe/Belgrade">(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
<option value="Europe/Berlin">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Bratislava">(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
<option value="Europe/Brussels">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="Europe/Bucharest">(UTC+02:00) Athens, Bucharest</option>
<option value="Europe/Budapest">(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
<option value="Europe/Busingen">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Chisinau">(UTC+02:00) Chisinau</option>
<option value="Europe/Copenhagen">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="Europe/Dublin">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Europe/Gibraltar">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Guernsey">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Europe/Helsinki">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Isle_of_Man">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Europe/Istanbul">(UTC+03:00) Istanbul</option>
<option value="Europe/Jersey">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Europe/Kaliningrad">(UTC+02:00) Kaliningrad</option>
<option value="Europe/Kiev">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Kirov">(UTC+03:00) Moscow, St. Petersburg</option>
<option value="Europe/Kyiv">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Lisbon">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Europe/Ljubljana">(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
<option value="Europe/London">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Europe/Luxembourg">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Madrid">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="Europe/Malta">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Mariehamn">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Minsk">(UTC+03:00) Minsk</option>
<option value="Europe/Monaco">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Moscow">(UTC+03:00) Moscow, St. Petersburg</option>
<option value="Europe/Nicosia">(UTC+02:00) Athens, Bucharest</option>
<option value="Europe/Oslo">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Paris">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="Europe/Podgorica">(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
<option value="Europe/Prague">(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
<option value="Europe/Riga">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Rome">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Samara">(UTC+04:00) Izhevsk, Samara</option>
<option value="Europe/San_Marino">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Sarajevo">(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb</option>
<option value="Europe/Saratov">(UTC+04:00) Saratov</option>
<option value="Europe/Simferopol">(UTC+03:00) Moscow, St. Petersburg</option>
<option value="Europe/Skopje">(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb</option>
<option value="Europe/Sofia">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Stockholm">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Tallinn">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Tirane">(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
<option value="Europe/Tiraspol">(UTC+02:00) Chisinau</option>
<option value="Europe/Ulyanovsk">(UTC+04:00) Astrakhan, Ulyanovsk</option>
<option value="Europe/Uzhgorod">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Vaduz">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Vatican">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Vienna">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Vilnius">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Volgograd">(UTC+03:00) Volgograd</option>
<option value="Europe/Warsaw">(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb</option>
<option value="Europe/Zagreb">(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb</option>
<option value="Europe/Zaporozhye">(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius</option>
<option value="Europe/Zurich">(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="GB">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="GB-Eire">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="GMT">(UTC) Coordinated Universal Time</option>
<option value="GMT+0">(UTC) Coordinated Universal Time</option>
<option value="GMT-0">(UTC) Coordinated Universal Time</option>
<option value="GMT0">(UTC) Coordinated Universal Time</option>
<option value="Greenwich">(UTC) Coordinated Universal Time</option>
<option value="HST">(UTC-10:00) Hawaii</option>
<option value="Hongkong">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Iceland">(UTC+00:00) Monrovia, Reykjavik</option>
<option value="Indian/Antananarivo">(UTC+03:00) Nairobi</option>
<option value="Indian/Chagos">(UTC+06:00) Bishkek</option>
<option value="Indian/Christmas">(UTC+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Indian/Cocos">(UTC+06:30) Yangon (Rangoon)</option>
<option value="Indian/Comoro">(UTC+03:00) Nairobi</option>
<option value="Indian/Kerguelen">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Indian/Mahe">(UTC+04:00) Port Louis</option>
<option value="Indian/Maldives">(UTC+05:00) Ashgabat, Tashkent</option>
<option value="Indian/Mauritius">(UTC+04:00) Port Louis</option>
<option value="Indian/Mayotte">(UTC+03:00) Nairobi</option>
<option value="Indian/Reunion">(UTC+04:00) Port Louis</option>
<option value="Iran">(UTC+03:30) Tehran</option>
<option value="Israel">(UTC+02:00) Jerusalem</option>
<option value="Jamaica">(UTC-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="Japan">(UTC+09:00) Osaka, Sapporo, Tokyo</option>
<option value="Kwajalein">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Libya">(UTC+02:00) Tripoli</option>
<option value="MET">(UTC+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="MST">(UTC-07:00) Arizona</option>
<option value="MST7MDT">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="Mexico/BajaNorte">(UTC-08:00) Baja California</option>
<option value="Mexico/BajaSur">(UTC-07:00) La Paz, Mazatlan</option>
<option value="Mexico/General">(UTC-06:00) Guadalajara, Mexico City, Monterrey</option>
<option value="NZ">(UTC+12:00) Auckland, Wellington</option>
<option value="NZ-CHAT">(UTC+12:45) Chatham Islands</option>
<option value="Navajo">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="PRC">(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="PST8PDT">(UTC-08:00) Pacific Time (US & Canada)</option>
<option value="Pacific/Apia">(UTC+13:00) Samoa</option>
<option value="Pacific/Auckland">(UTC+12:00) Auckland, Wellington</option>
<option value="Pacific/Bougainville">(UTC+11:00) Bougainville Island</option>
<option value="Pacific/Chatham">(UTC+12:45) Chatham Islands</option>
<option value="Pacific/Chuuk">(UTC+10:00) Guam, Port Moresby</option>
<option value="Pacific/Easter">(UTC-06:00) Easter Island</option>
<option value="Pacific/Efate">(UTC+11:00) Solomon Is., New Caledonia</option>
<option value="Pacific/Enderbury">(UTC+13:00) Coordinated Universal Time+13</option>
<option value="Pacific/Fakaofo">(UTC+13:00) Coordinated Universal Time+13</option>
<option value="Pacific/Fiji">(UTC+12:00) Fiji</option>
<option value="Pacific/Funafuti">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Pacific/Galapagos">(UTC-06:00) Central America</option>
<option value="Pacific/Gambier">(UTC-09:00) Coordinated Universal Time-09</option>
<option value="Pacific/Guadalcanal">(UTC+11:00) Solomon Is., New Caledonia</option>
<option value="Pacific/Guam">(UTC+10:00) Guam, Port Moresby</option>
<option value="Pacific/Honolulu">(UTC-10:00) Hawaii</option>
<option value="Pacific/Johnston">(UTC-10:00) Hawaii</option>
<option value="Pacific/Kanton">(UTC+13:00) Coordinated Universal Time+13</option>
<option value="Pacific/Kiritimati">(UTC+14:00) Kiritimati Island</option>
<option value="Pacific/Kosrae">(UTC+11:00) Solomon Is., New Caledonia</option>
<option value="Pacific/Kwajalein">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Pacific/Majuro">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Pacific/Marquesas">(UTC-09:30) Marquesas Islands</option>
<option value="Pacific/Midway">(UTC-11:00) Coordinated Universal Time-11</option>
<option value="Pacific/Nauru">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Pacific/Niue">(UTC-11:00) Coordinated Universal Time-11</option>
<option value="Pacific/Norfolk">(UTC+11:00) Norfolk Island</option>
<option value="Pacific/Noumea">(UTC+11:00) Solomon Is., New Caledonia</option>
<option value="Pacific/Pago_Pago">(UTC-11:00) Coordinated Universal Time-11</option>
<option value="Pacific/Palau">(UTC+09:00) Osaka, Sapporo, Tokyo</option>
<option value="Pacific/Pitcairn">(UTC-08:00) Coordinated Universal Time-08</option>
<option value="Pacific/Pohnpei">(UTC+11:00) Solomon Is., New Caledonia</option>
<option value="Pacific/Ponape">(UTC+11:00) Solomon Is., New Caledonia</option>
<option value="Pacific/Port_Moresby">(UTC+10:00) Guam, Port Moresby</option>
<option value="Pacific/Rarotonga">(UTC-10:00) Hawaii</option>
<option value="Pacific/Saipan">(UTC+10:00) Guam, Port Moresby</option>
<option value="Pacific/Samoa">(UTC-11:00) Coordinated Universal Time-11</option>
<option value="Pacific/Tahiti">(UTC-10:00) Hawaii</option>
<option value="Pacific/Tarawa">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Pacific/Tongatapu">(UTC+13:00) Nuku'alofa</option>
<option value="Pacific/Truk">(UTC+10:00) Guam, Port Moresby</option>
<option value="Pacific/Wake">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Pacific/Wallis">(UTC+12:00) Coordinated Universal Time+12</option>
<option value="Pacific/Yap">(UTC+10:00) Guam, Port Moresby</option>
<option value="Poland">(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb</option>
<option value="Portugal">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="ROC">(UTC+08:00) Taipei</option>
<option value="ROK">(UTC+09:00) Seoul</option>
<option value="Singapore">(UTC+08:00) Kuala Lumpur, Singapore</option>
<option value="Turkey">(UTC+03:00) Istanbul</option>
<option value="UCT">(UTC) Coordinated Universal Time</option>
<option value="US/Alaska">(UTC-09:00) Alaska</option>
<option value="US/Aleutian">(UTC-10:00) Aleutian Islands</option>
<option value="US/Arizona">(UTC-07:00) Arizona</option>
<option value="US/Central">(UTC-06:00) Central Time (US & Canada)</option>
<option value="US/East-Indiana">(UTC-05:00) Indiana (East)</option>
<option value="US/Eastern">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="US/Hawaii">(UTC-10:00) Hawaii</option>
<option value="US/Indiana-Starke">(UTC-06:00) Central Time (US & Canada)</option>
<option value="US/Michigan">(UTC-05:00) Eastern Time (US & Canada)</option>
<option value="US/Mountain">(UTC-07:00) Mountain Time (US & Canada)</option>
<option value="US/Pacific">(UTC-08:00) Pacific Time (US & Canada)</option>
<option value="US/Samoa">(UTC-11:00) Coordinated Universal Time-11</option>
<option value="UTC">(UTC) Coordinated Universal Time</option>
<option value="Universal">(UTC) Coordinated Universal Time</option>
<option value="W-SU">(UTC+03:00) Moscow, St. Petersburg</option>
<option value="WET">(UTC+00:00) Dublin, Edinburgh, Lisbon, London</option>
<option value="Zulu">(UTC) Coordinated Universal Time</option>
</select>
@mdmontesinos thank you for investigating TimeZoneNames and TimeZoneConverter. At this point I am seriously wondering if it makes sense to simply create a static class in Oqtane which contains a list of IANA codes and friendly time zone names and utilize it to populate the list of time zones in the UI. Yes, it means that Oqtane would take on the burden of maintaining this class in the future - but the list is relatively static and it would still be based on the IANA standard so there is a source of truth to synchronize with periodically. Using TimeZoneNames/TimeZoneConverter may alleviate some of this burden but it comes with its own set of baggage which outweighs the values it provides (at least for our simple requirements). We can still rely on NodaTime to provide the conversion of UTC date/times based on IANA ID.
@sbwalker It's definitely not an ideal solution, but perhaps feasible and would work just good enough for the requirements
@mdmontesinos PR #5411 is a proposed solution to the problem discussed above which utilizes the existing Localization infrastructure to solve the problem:
- uses NodaTime to retrieve the list of IANA IDs
- uses Localizaton (TimeZoneResources.resx) to convert the IANA IDs to Display Names
- list of time zones is sorted by Display Name
Benefits:
- not dependent on third party libraries
- Display Names not limited by third party library format (ie. can be customized)
- allows entire workload to run on the client
- supports localization into other languages using standard approach
- simple to maintain
- easy for developers to implement in their own components
Cons:
- requires TimeZoneResources.resx to be maintained when IANA information changes
Note that the PR is not 100% complete - work remaining:
- TimeZoneResources.resx still needs to be fully populated
- TimeZoneService needs to be implemented in every component where Utilities.GetTimeZones() is called (currently only implemented in User Profile)
Please let me know your thoughts.
@sbwalker Given the alternatives, the solution you proposed seems adequate enough, although let me add some comments:
- The localization into different languages will be quite painful, as there are A LOT of timezones
- The translations might not be "standard", so it could be confusing for users which are used to the common ways of naming the TZs
- Will the resx contain all the timezones returned by NodaTime? If so, how will it handle the cases of duplicates like "Europe/Madrid" and "Europe/Paris" being both named "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris" in TimeZoneNames?
- I think the Utilities.GetTimeZones() method should be removed and include its logic into TimeZoneService. Otherwise, it will be confusing to have them both.
@mdmontesinos I am not really happy with any of the solutions so far. It is shocking to think the basic cross platform time zone support is this bad in .NET in 2025. Usually when something seems overly difficult, it means that you are not doing it right... so I would really like to know if there is something obvious that I am missing.
For example, do most applications simply obtain the time zone dynamically on the client rather than relying on a specification on the server. If this were true then there would be no need to get a list of available time zones and no need to store the value in the Site or User tables - it would be part of the run-time context and NodaTime could still be used to convert UTC dates to a visitors time zone in razor components.
One other option is to simply use the list of time zones supported by NodaTime and make a best effort to convert them into "friendly" names:
var timezones = new List<TimeZone>();
foreach (var tz in DateTimeZoneProviders.Tzdb.GetAllZones()
.Where(item => !item.Id.ToLower().Contains("etc"))
.OrderBy(item => item.GetUtcOffset(Instant.FromDateTimeUtc(DateTime.UtcNow)).Ticks))
{
var offset = tz.GetUtcOffset(Instant.FromDateTimeUtc(DateTime.UtcNow)).Ticks;
timezones.Add(new TimeZone()
{
Id = tz.Id,
DisplayName = "(UTC" + (offset >= 0 ? "+" : "-") + new DateTime(Math.Abs(offset)).ToString("hh:mm") + ") " + tz.Id.Replace("_", " ").Replace("/", " / ")
});
}
Produces a list with "friendly" names sorted in order by offset (sample below):
US/Hawaii = (UTC-10:00) US / Hawaii America/Rankin_Inlet = (UTC-05:00) America / Rankin Inlet Europe/Belfast = (UTC+01:00) Europe / Belfast Australia/Canberra = (UTC+10:00) Australia / Canberra
Note that NodaTime includes ~550 time zones whereas Windows only includes ~250 time zones (https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/default-time-zones?view=windows-11)
In regards to my earlier statement:
"For example, do most applications simply obtain the time zone dynamically on the client rather than relying on a specification on the server. If this were true then there would be no need to get a list of available time zones and no need to store the value in the Site or User tables - it would be part of the run-time context and NodaTime could still be used to convert UTC dates to a visitors time zone in razor components."
There is a technical challenge as the time zone needs to be determined on the client browser. For Interactive Blazor this can be accomplished using JS Interop. However Static Blazor does not support JS Interop and I have not been able to find an alternative way to accomplish this.
@mdmontesinos I am not really happy with any of the solutions so far. It is shocking to think the basic cross platform time zone support is this bad in .NET in 2025. Usually when something seems overly difficult, it means that you are not doing it right... so I would really like to know if there is something obvious that I am missing.
For example, do most applications simply obtain the time zone dynamically on the client rather than relying on a specification on the server. If this were true then there would be no need to get a list of available time zones and no need to store the value in the Site or User tables - it would be part of the run-time context and NodaTime could still be used to convert UTC dates to a visitors time zone in razor components.
@sbwalker Even if you obtain the user's timezone dynamically, I believe it would be poor UX to not also provide the list, as a user might want to change it for whatever reason. And yes, time zone support is quite painful in .NET...
One other option is to simply use the list of time zones supported by NodaTime and make a best effort to convert them into "friendly" names:
var timezones = new List<TimeZone>(); foreach (var tz in DateTimeZoneProviders.Tzdb.GetAllZones() .Where(item => !item.Id.ToLower().Contains("etc")) .OrderBy(item => item.GetUtcOffset(Instant.FromDateTimeUtc(DateTime.UtcNow)).Ticks)) { var offset = tz.GetUtcOffset(Instant.FromDateTimeUtc(DateTime.UtcNow)).Ticks; timezones.Add(new TimeZone() { Id = tz.Id, DisplayName = "(UTC" + (offset >= 0 ? "+" : "-") + new DateTime(Math.Abs(offset)).ToString("hh:mm") + ") " + tz.Id.Replace("_", " ").Replace("/", " / ") }); }Produces a list with "friendly" names sorted in order by offset (sample below):
US/Hawaii = (UTC-10:00) US / Hawaii America/Rankin_Inlet = (UTC-05:00) America / Rankin Inlet Europe/Belfast = (UTC+01:00) Europe / Belfast Australia/Canberra = (UTC+10:00) Australia / Canberra
Note that NodaTime includes ~550 time zones whereas Windows only includes ~250 time zones (https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/default-time-zones?view=windows-11)
I actually quite like the friendly names you generated, I think that should be good enough for the user to not be lost while selecting the tz.
In regards to my earlier statement:
"For example, do most applications simply obtain the time zone dynamically on the client rather than relying on a specification on the server. If this were true then there would be no need to get a list of available time zones and no need to store the value in the Site or User tables - it would be part of the run-time context and NodaTime could still be used to convert UTC dates to a visitors time zone in razor components."
There is a technical challenge as the time zone needs to be determined on the client browser. For Interactive Blazor this can be accomplished using JS Interop. However Static Blazor does not support JS Interop and I have not been able to find an alternative way to accomplish this.
That's right, I don't think there's an easy way to achieve this in static blazor. In my static modules, I was able to handle the browser's time zone in the following way:
- I have a custom select component with a js script that allows easily setting the selected value, raising events when it changes, writing them to query, etc
- I wrap my timezone selection in that component and configure the selection function in the modules where I need to. This is also where the default timezone from the browser is selected, in case it wasn't selected before and stored into local storage
function addTimezoneSelection(selectorId, callback) {
if (!currentTimezone) {
const queryTimezone = window.Utilities.getQueryParam(timezoneQueryKey);
if (!queryTimezone) {
const localStorageTimezone = localStorage.getItem(timezoneQueryKey);
if (!localStorageTimezone) {
currentTimezone = getBrowserTimezone();
localStorage.setItem(timezoneQueryKey, currentTimezone);
}
else {
currentTimezone = localStorageTimezone;
}
}
}
window.Utilities.addSelectionEvent(selectorId, currentTimezone, timezoneQueryKey, callback, false);
}
As the callback has no way to interact with Blazor, whenever the tz changes, I have to re-render the corresponding UI by fetching the HTML from the server
- The callback is a js function that uses
fetchto make a request to my controller - The controller uses the HtmlRenderer to generate an HTML of the component component with the newly selected tz
- The returned HTML replaces the previous element
This is obviously a custom solution with additional complexity and details that is able to satisfy my requirements, but it's not easily adaptable to the core framework.
@mdmontesinos #5421 offers more improvements to the time zone list:
- it filters out time zones which do not have an associated country (this reduces the list by ~120 entries)
- it allows for localization in TimeZoneResources.resx however if no localization is provided, it uses "friendly" fallback behavior
- Localization is restricted to the time zone name only - the time zone offset ie. (UTC-05:00) is calculated by the system based on the current date/time
- fixed time formatting to use "HH:mm" 24 hour time
If this looks good, I will removed the method from Utilities and implement TimeZoneService in all applicable areas.
@mdmontesinos #5421 offers more improvements to the time zone list:
- it filters out time zones which do not have an associated country (this reduces the list by ~120 entries)
- it allows for localization in TimeZoneResources.resx however if no localization is provided, it uses "friendly" fallback behavior
- Localization is restricted to the time zone name only - the time zone offset ie. (UTC-05:00) is calculated by the system based on the current date/time
- fixed time formatting to use "HH:mm" 24 hour time
If this looks good, I will removed the method from Utilities and implement TimeZoneService in all applicable areas.
@sbwalker this looks fantastic, as it provides a nice default display list, but still allowing localization if needed. Why do you need to handle us timezones specifically? Dont they have the country code set?
@mdmontesinos Correct, the U.S. time zones do not include a country code - not sure if this is a bug in NodaTime as the TZDB includes a country code for them (https://en.m.wikipedia.org/wiki/List_of_tz_database_time_zones)