c # - GetSystemTimeZones mangler GMT Standard Time

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har forsøgt at bruge TimeZoneInfo.GetSystemTimeZones i .net4 til at erstatte vores gamle metode, der bruger COM til at ringe ind i en MFC-kode. Jeg har dog nødt til at vende tilbage til COM-metoden, fordi GetSystemTimeZones ikke returnerer alle tidszoner. At være baseret i Storbritannien og ikke inklusive GMT Standard Time i vores liste over muligheder er et problem.


Når jeg ser i registreringsdatabasen, finder jeg, at GMT Standard Time har en Dynamisk DST undernøgle uden nogen regler defineret. Jeg downloadede .net4-kildekoden, og i TimeZoneInfo.cs kalder GetSystemTimeZones til sidst TryCreateAdjustmentRules, som ser ud til at returnere falsk, hvis Dynamic DST -tasten ikke har defineret FirstEntry eller LastEntry.


            //
            // loop over all of the "<time\_zone\_name>Dynamic DST" hive entries 
            // 
            // read FirstEntry  {MinValue      - (year1, 12, 31)}
            // read MiddleEntry {(yearN, 1, 1) - (yearN, 12, 31)} 
            // read LastEntry   {(yearN, 1, 1) - MaxValue       }

            // read the FirstEntry and LastEntry key values (ex: "1980", "2038")
            Int32 first = (Int32)dynamicKey.GetValue(c\_firstEntryValue, -1, RegistryValueOptions.None); 
            Int32 last = (Int32)dynamicKey.GetValue(c\_lastEntryValue, -1, RegistryValueOptions.None);

            if (first == -1 || last == -1 || first > last) { 
                rules = null;
                return false; 
            }


Når TryCreateAdjustmentRules returnerer falsk, kaster TryGetTimeZoneByRegistryKey en InvalidTimeZoneException, hvilket betyder at GMT Standard Time ikke bliver tilføjet til tidszonesamlingen. Jeg har forsøgt at slette de tomme Dynamic DST undernøgler, men noget tilføjer dem tilbage igen (sandsynligvis Windows Update).


Jeg har lavet en masse søgning, men har ikke set nogen andre rapporter om dette problem. Jeg er ikke sikker på, om der er en GetSystemTimeZones-løsning, eller om jeg kan stoppe den tomme Dynamic DST -nøgle, der vises i første omgang.

Bedste reference


Jeg gætter på dette er bare et problem med registreringsdatabasen.


Noget lignende er beskrevet her for WinXP/Server 2003 SP1.
Se venligst om følgende hjælper:
http://blogs.technet.com/b/dst2007/archive/2007/03/06/missing-time-zones-in-registry.aspx[2]


Mit gæt er, at du kunne eksportere hele registreringsdatabasenøglen fra en anden maskine og anvende den på din problematiske boks (er).

Andre referencer 1


Det viser sig, at problemet er med vores COM-objekt og ikke med .NET-koden. Koden til læsning af registreringsdatabasen bør kun læses, men det fejler opkald RegCreateKey for at optimere flere opkald til samme registerafdeling.


Når COM-objektet er registreret (med administratorrettigheder) på grund af en ny version, indlæser den tidszoner og skaber Dynamic DST for den lokale tidszone, som i mit tilfælde er GMT/UTC.


Administratorer, jeg antager, at dette spørgsmål skal markeres for sletning.

Andre referencer 2


Efter at have set det over dit problem og endda kører koden, du gav i kommentarerne til at udskrive en liste over tidssoner, kan jeg ikke få GMT til at dukke op på mit system. Jeg kører Windows 7 Professional og vælge GMT er bare ikke en mulighed. Jeg ved, at det ikke løser dit problem, og du - ligesom mange andre mennesker - lyder som om du virkelig har brug for at få dette til at fungere sammen med GMT.


Men hvis det overhovedet er muligt, hvis du ser en måde at bruge UTC på, så tjekker jeg disse links:


Windows 7 Manglende support til GMT [3]


Konvertering af UTC til GMT [4]


Bare et andet muligt svar på dit problem, er der alligevel kan du oprette en wrapper omkring UTC-værdierne for at vise GMT? Jeg spørger, fordi dette problem ikke virker som om det snart vil gå væk. Selvom du får det til at fungere nu - i fremtiden kan det bryde igen. Hvis jeg kommer op med en metode til dette, vil jeg opdatere mit svar .