2012-02-10 11 views
11

Mam dziwny problem, którego nie mogę rozwiązać. Kiedy zadzwonię na numer TimeZoneInfo.GetSystemTimeZones na moim komputerze z Win 7 x 64, otrzymuję 101 wyników. Kiedy wywołuję TimeZoneInfo.FindSystemTimeZoneById na każdym z nich i przekazuję atrybut StandardName obiektu TimeZoneInfo, 3 z nich rzucają TimeZoneNotFoundException.Dlaczego niektóre strefy czasowe są zwracane przez GetSystemTimeZones nie znalezione przez FindSystemTimeZoneById?

Oto próbka:

var tzs = TimeZoneInfo.GetSystemTimeZones(); 

foreach (var timeZoneInfo in tzs.OrderBy(t => t.BaseUtcOffset)) 
{ 
    try 
    { 
    TimeZoneInfo.FindSystemTimeZoneById(timeZoneInfo.StandardName); 
    } 
    catch (TimeZoneNotFoundException) 
    { 
    Console.WriteLine(timeZoneInfo.DisplayName + "|" + timeZoneInfo.StandardName + "|" + timeZoneInfo.BaseUtcOffset); 
    } 
} 

Console.ReadLine(); 

ten ma problem ze znalezieniem "uniwersalny czas koordynowany", "Jerozolima Standard Time" i "Półwysep Malajski Standard Time". Biorąc sprawę jak Malezji, widzę dla niego wpis, gdy patrzę na dostępnych stref czasowych w ustawieniach regionalnych, chociaż to pokazano atrybutu DisplayName zamiast StandardName:

Time zones

Jednak mogę nie widać tego pod żadną nazwą podczas przeglądania rejestru w HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Strefy czasowe

Co tu się dzieje? Dlaczego strefa czasowa Malezji nie może być załadowana według nazwy?

Proszę nie wprowadzać alternatywnych implementacji stref czasowych za pomocą innych bibliotek - na razie chcę tylko przejść do sedna tego problemu. Dzięki!

Odpowiedz

15

TimeZoneInfo.FindSystemTimeZoneById Metoda przyjmuje jako identyfikator parametr strefy czasowej. Zamiast tego używasz timeZoneInfo.StandardName.

Wygląda na to, że dla tych 3 stref wartości dla właściwości TimeZoneInfo.StandardName i TimeZoneInfo.Id są różne. Użycie tego:

TimeZoneInfo.FindSystemTimeZoneById(timeZoneInfo.Id); 

rozwiąże problem.

+1

Dziwne jak mój kod wygląda z perspektywy czasu (tj. Brakuje mu boleśnie oczywistego), to także dziwne, że tylko 3 z 101 TZ mają inny identyfikator niż standardowa nazwa! Okazuje się, że Malezja to "Singapore Standard Time". Proszę bardzo! –

+0

@alex Czy mamy właściwość TimeZoneInfo.ID jako prawidłową właściwość? –

Powiązane problemy