Fix TimeZoneInfo.HasIanaId when using Local Time Zone (#58414)
authorTarek Mahmoud Sayed <tarekms@microsoft.com>
Tue, 31 Aug 2021 19:46:07 +0000 (12:46 -0700)
committerGitHub <noreply@github.com>
Tue, 31 Aug 2021 19:46:07 +0000 (12:46 -0700)
src/libraries/System.Private.CoreLib/src/System/TimeZoneInfo.cs
src/libraries/System.Runtime/tests/System/TimeZoneInfoTests.cs

index ee0baa1..c1e1b2e 100644 (file)
@@ -85,7 +85,8 @@ namespace System
                                             timeZone._standardDisplayName,
                                             timeZone._daylightDisplayName,
                                             timeZone._adjustmentRules,
-                                            disableDaylightSavingTime: false);
+                                            disableDaylightSavingTime: false,
+                                            timeZone.HasIanaId);
 
                         _localTimeZone = timeZone;
                     }
@@ -1954,7 +1955,7 @@ namespace System
                 else
                 {
                     value = new TimeZoneInfo(match!._id, match._baseUtcOffset, match._displayName, match._standardDisplayName,
-                                          match._daylightDisplayName, match._adjustmentRules, disableDaylightSavingTime: false);
+                                          match._daylightDisplayName, match._adjustmentRules, disableDaylightSavingTime: false, match.HasIanaId);
                 }
             }
             else
index 38c8bd8..e9f08a9 100644 (file)
@@ -2642,6 +2642,24 @@ namespace System.Tests
         }
 
         public static bool SupportIanaNamesConversion => PlatformDetection.IsNotBrowser && PlatformDetection.ICUVersion.Major >= 52;
+        public static bool SupportIanaNamesConversionAndRemoteExecution => SupportIanaNamesConversion && RemoteExecutor.IsSupported;
+
+        // This test is executed using the remote execution because it needs to run before creating the time zone cache to ensure testing with that state.
+        // There are already other tests that test after creating the cache.
+        [ConditionalFact(nameof(SupportIanaNamesConversionAndRemoteExecution))]
+        public static void IsIanaIdWithNotCacheTest()
+        {
+            RemoteExecutor.Invoke(() =>
+            {
+                Assert.Equal(!s_isWindows || TimeZoneInfo.Local.Id.Equals("Utc", StringComparison.OrdinalIgnoreCase), TimeZoneInfo.Local.HasIanaId);
+
+                TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
+                Assert.False(tzi.HasIanaId);
+
+                tzi = TimeZoneInfo.FindSystemTimeZoneById("Europe/Berlin");
+                Assert.True(tzi.HasIanaId);
+            }).Dispose();
+        }
 
         [ConditionalFact(nameof(SupportIanaNamesConversion))]
         [ActiveIssue("https://github.com/dotnet/runtime/issues/52072", TestPlatforms.iOS | TestPlatforms.tvOS | TestPlatforms.MacCatalyst)]
@@ -2649,6 +2667,8 @@ namespace System.Tests
         {
             bool expected = !s_isWindows;
 
+            Assert.Equal((expected || TimeZoneInfo.Local.Id.Equals("Utc", StringComparison.OrdinalIgnoreCase)), TimeZoneInfo.Local.HasIanaId);
+
             foreach (TimeZoneInfo tzi in TimeZoneInfo.GetSystemTimeZones())
             {
                 Assert.True((expected || tzi.Id.Equals("Utc", StringComparison.OrdinalIgnoreCase)) == tzi.HasIanaId, $"`{tzi.Id}` has wrong IANA Id indicator");