2013-03-28 16 views
5

Wiem, że możemy zmienić aktualną kulturę dla bieżącego wątku. I wiem, że nie mogliśmy dostać TimeZoneInfo z CurrentCulturebo jednej kulturze może posiada wiele stref czasowychjak USAJak ustawić strefę czasową na wątek?

ale na tej samej techniki radzenia sobie z TimeZone dla bieżącego wątku.

Byłoby bardzo miło, gdybyśmy mogli zrobić coś takiego:

TimeZone.CurrentTimeZone = TimeZoneInfo.FindSystemTimeZoneById("timezone id"); 
+1

Nie jesteśmy pożądanym funkcje serwisu NET, jesteśmy solidne odpowiedzi na solidną stronę z pytaniami. Obsługa stref czasowych nie jest trywialna w najlepszym momencie, a dodanie warstwy złożoności strefy czasowej na wątek wymaga tylko kłopotów. – Petesh

+0

@Petesh Nie chciałem zapytać, dlaczego tak naprawdę. Zastanawiałem się, czy jest to możliwe w jakiś sposób. –

+1

Nic nie stoi na przeszkodzie, aby utworzyć lokalny wątek dla stref czasowych, po prostu nie użyje go nic poza kodem. Powinieneś spojrzeć na ['ThreadLocal ' Class] (http://msdn.microsoft.com/en-us/library/dd642243.aspx) w .NET dla trywialnego sposobu implementacji. – Petesh

Odpowiedz

5

Niestety, każda koncepcja „aktualnego” strefy czasowej jest związana z ustawieniami systemu operacyjnego urządzenia, które kod jest uruchomiony. Istnieje kilka apisów Win32 do zmiany strefy czasowej, ale nie polecam ich używania. Nie tylko nie są "bezpieczne dla wątków", ale również nie są "bezpieczne w obróbce". Ustawienie strefy czasowej wpływa na wszystko, co dzieje się na urządzeniu.

Powiedziałbym, że byłbym ciekawy, jaki jest twój przypadek użycia. Jeśli jesteś w stanie ustawić strefę czasową dla danego wątku, prawdopodobnie nie możesz w ogóle polegać na ustawieniach lokalnych. Najprawdopodobniej możesz użyć metod konwersji pod numerem TimeZoneInfo.

Załóżmy na przykład, że szukasz bieżącego czasu w innej strefie czasowej. Być może szukasz możliwości aby to zrobić:

using (TimeZone.CurrentTimeZone = ... ) 
{ 
    var now = DateTime.Now; 
} 

Ale zamiast tego należy po prostu przekonwertować z UTC w stosownych przypadkach:

var now = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
         DateTime.UtcNow, "some other timezone id"); 
+0

Strefa czasowa jest używana niejawnie w wielu różnych funkcjach (np. Konwersja z ciągu znaków na datę i godzinę za pomocą 'AdjustToUniversal'). Można je z pewnością zmienić ręcznie, aby korzystać z jawnej strefy czasowej, ale nie jest to łatwe w przypadku dużej bazy kodu. W ten sam sposób można jawnie określić kulturę do użycia w funkcjach takich jak 'string.Format()' - ale istnieje alternatywa do ustawienia kultury dla wątku i "naprawienia wszystkich" za jednym razem. – MiMo

+2

Tak, używane wewnętrznie przez wiele funkcji, ale nie - nie można tego zmienić. Nie ma haczyków i wszystko jest zapieczętowane. Można by pomyśleć, że zachowałoby się jak cultureinfo, ale tak nie jest. Jest zupełnie inaczej. Istnieje tylko jedno systemowe ustawienie strefy czasowej. –

+0

Tak, wiem - mój poprzedni komentarz był próbą odpowiedzi na twoje pytanie "jaki jest (byłby) przypadek użycia" czegoś takiego - gdyby istniał. – MiMo

Powiązane problemy