Strefy czasowe — omówienie
Klasa TimeZoneInfo upraszcza tworzenie aplikacji obsługujących strefy czasowe. Klasa TimeZone obsługuje pracę z lokalną strefą czasową i uniwersalnym czasem koordynowanym (UTC). Klasa TimeZoneInfo obsługuje obie te strefy, a także dowolną strefę czasową, o której informacje są wstępnie zdefiniowane w rejestrze. Można również użyć TimeZoneInfo do zdefiniowania niestandardowych stref czasowych, o których system nie ma informacji.
Podstawy strefy czasowej
Strefa czasowa to region geograficzny, w którym jest używany ten sam czas. Zazwyczaj, ale nie zawsze sąsiadujące strefy czasowe są jedną godzinę od siebie. Czas w dowolnej ze stref czasowych na świecie można wyrazić jako przesunięcie od uniwersalnego czasu koordynowanego (UTC).
Wiele stref czasowych na świecie obsługuje czas letni. Czas letni próbuje zmaksymalizować godziny dzienne, rozwijając czas do przodu o jedną godzinę wiosną lub wczesnym latem, i wracając do normalnego (lub standardowego) czasu późnego lata lub jesieni. Te zmiany do i z czasu standardowego są nazywane regułami korekt.
Przejście do i z czasu letniego w określonej strefie czasowej można zdefiniować za pomocą stałej lub zmiennej reguły korekty. Stała reguła korekty określa określoną datę, w której następuje przejście do lub z czasu letniego każdego roku. Na przykład przejście z czasu letniego na standardowy czas, który występuje każdego roku 25 października, jest zgodne z stałą regułą korekty. Znacznie bardziej powszechne są reguły regulacji zmiennoprzecinkowych, które ustawiają konkretny dzień określonego tygodnia określonego miesiąca na przejście do lub od czasu letniego. Na przykład przejście z czasu standardowego na czas letni, który występuje w trzeciej niedzieli marca, następuje zgodnie z zmienną regułą korekty.
W przypadku stref czasowych, które obsługują reguły korekty, przejście do i z czasu letniego tworzy dwa rodzaje nietypowych czasów: nieprawidłowe czasy i niejednoznaczne czasy. Nieprawidłowy czas to nieistnieujący czas utworzony przez przejście od czasu standardowego do czasu letniego. Na przykład, jeśli to przejście występuje w określonym dniu o godzinie 2:00 i powoduje, że czas zmiany na 3:00 rano, za każdym razem interwał między 2:00 a 2:59:59 jest nieprawidłowy. Niejednoznaczny czas to czas, który można mapować na dwa różne czasy w jednej strefie czasowej. Jest on tworzony przez przejście od czasu letniego do standardowego. Na przykład, jeśli to przejście występuje w określonym dniu o godzinie 2:00 i powoduje zmianę czasu na 1:00, za każdym razem interwał między 1:00 a 1:59:59 może być interpretowany jako czas standardowy lub czas letni.
Terminologia dotycząca strefy czasowej
W poniższej tabeli zdefiniowano terminy powszechnie używane podczas pracy ze strefami czasowymi i tworzenia aplikacji obsługujących strefy czasowe.
Termin | Definicja |
---|---|
Reguła korekty | Reguła, która określa, kiedy następuje przejście z czasu standardowego na czas letni i powrót z czasu letniego do standardowego. Każda reguła korekty ma datę początkową i końcową, która określa, kiedy reguła jest w miejscu (na przykład reguła korekty jest obowiązuje od 1 stycznia 1986 r. do 31 grudnia 2006 r.), różnicy (czasu, przez który czas standardowy zmienia się w wyniku zastosowania reguły korekty) oraz informacji o określonej dacie i godzinie, która ma nastąpić w okresie korekty. Przejścia mogą być zgodne z stałą regułą lub zmienną regułą. |
Niejednoznaczny czas | Czas, który można zamapować na dwa różne razy w jednej strefie czasowej. Występuje, gdy czas zegara jest dostosowywany z powrotem w czasie, na przykład podczas przejścia ze strefy czasowej czas letni do czasu standardowego. Na przykład, jeśli to przejście występuje w określonym dniu o godzinie 2:00 i powoduje zmianę czasu na 1:00, za każdym razem interwał między 1:00 a 1:59:59 może być interpretowany jako czas standardowy lub czas letni. |
Naprawiono regułę | Reguła korekty określająca określoną datę przejścia do lub z czasu letniego. Na przykład przejście z czasu letniego na standardowy czas, który występuje każdego roku 25 października, jest zgodne z stałą regułą korekty. |
Reguła zmiennoprzecinkowa | Reguła korekty, która określa konkretny dzień określonego tygodnia określonego miesiąca dla przejścia do lub z czasu letniego. Na przykład przejście z czasu standardowego na czas letni, który występuje w trzeciej niedzieli marca, następuje zgodnie z zmienną regułą korekty. |
Nieprawidłowy czas | Nieistniejący czas, który jest artefaktem przejścia z czasu standardowego do czasu letniego. Występuje, gdy czas zegara jest dostosowywany do przodu w czasie, na przykład podczas przejścia ze standardowego czasu strefy czasowej do czasu letniego. Na przykład, jeśli to przejście występuje w określonym dniu o godzinie 2:00 i powoduje, że czas zmiany na 3:00 rano, za każdym razem interwał między 2:00 a 2:59:59 jest nieprawidłowy. |
Czas przejścia | Informacje o określonej zmianie czasu, takie jak zmiana czasu letniego na czas standardowy lub odwrotnie, w określonej strefie czasowej. |
Strefy czasowe i klasa TimeZoneInfo
Na platformie .NET TimeZoneInfo obiekt reprezentuje strefę czasową. Klasa TimeZoneInfo zawiera metodę GetAdjustmentRules zwracającą tablicę TimeZoneInfo.AdjustmentRule obiektów. Każdy element tej tablicy zawiera informacje o przejściu do i od czasu letniego dla określonego okresu. (W przypadku stref czasowych, które nie obsługują czasu letniego, metoda zwraca pustą tablicę). Każdy TimeZoneInfo.AdjustmentRule obiekt ma DaylightTransitionStart właściwość i DaylightTransitionEnd , która definiuje określoną datę i godzinę przejścia do i z czasu letniego. Właściwość IsFixedDateRule wskazuje, czy przejście jest stałe, czy zmiennoprzecinkowe.
Platforma .NET opiera się na informacjach o strefie czasowej udostępnianych przez system operacyjny Windows i przechowywanych w rejestrze. Ze względu na liczbę stref czasowych ziemi nie wszystkie istniejące strefy czasowe są reprezentowane w rejestrze. Ponadto, ponieważ rejestr jest dynamiczną strukturą, wstępnie zdefiniowane strefy czasowe można dodawać lub usuwać z niego. Na koniec rejestr nie musi zawierać historycznych danych strefy czasowej. Na przykład w systemie Windows XP rejestr zawiera dane dotyczące tylko jednego zestawu korekt strefy czasowej. System Windows Vista obsługuje dynamiczne dane strefy czasowej, co oznacza, że jedna strefa czasowa może mieć wiele reguł korekty, które mają zastosowanie do określonych interwałów lat. Jednak większość stref czasowych zdefiniowanych w rejestrze systemu Windows Vista i obsługa czasu letniego ma tylko jedną lub dwie wstępnie zdefiniowane reguły korekty.
Zależność TimeZoneInfo klasy w rejestrze oznacza, że aplikacja z uwzględnieniem strefy czasowej nie może być pewna, że określona strefa czasowa jest zdefiniowana w rejestrze. W związku z tym próba utworzenia wystąpienia określonej strefy czasowej (innej niż lokalna strefa czasowa lub strefa czasowa reprezentująca utc) powinna używać obsługi wyjątków. Powinna również udostępnić pewną metodę zezwalania aplikacji na kontynuowanie, jeśli nie można utworzyć wystąpienia wymaganego TimeZoneInfo obiektu z rejestru.
Aby obsłużyć brak wymaganej strefy czasowej, klasa zawiera metodęCreateCustomTimeZone, TimeZoneInfo której można użyć do utworzenia niestandardowych stref czasowych, które nie znajdują się w rejestrze. Aby uzyskać szczegółowe informacje na temat tworzenia niestandardowej strefy czasowej, zobacz How to: Create time zones without adjustment rules (Jak tworzyć strefy czasowe bez reguł korekt) i How to: Create time zones with adjustment rules (Jak tworzyć strefy czasowe z regułami dostosowywania). Ponadto można użyć ToSerializedString metody , aby przekonwertować nowo utworzoną strefę czasową na ciąg i zapisać ją w magazynie danych (takim jak baza danych, plik tekstowy, rejestr lub zasób aplikacji). Następnie możesz użyć FromSerializedString metody , aby przekonwertować ten ciąg z powrotem na TimeZoneInfo obiekt. Aby uzyskać szczegółowe informacje, zobacz How to: Save time zones to an embedded resource (Instrukcje: zapisywanie stref czasowych w zasobie osadzonym) i How to: Restore time zones from an embedded resource (Jak przywrócić strefy czasowe z zasobu osadzonego).
Ponieważ każda strefa czasowa charakteryzuje się przesunięciem podstawowym od UTC, a także przesunięciem od UTC, które odzwierciedla wszelkie istniejące reguły korekty, czas w jednej strefie czasowej można łatwo przekonwertować na czas w innej strefie czasowej. W tym celu TimeZoneInfo obiekt zawiera kilka metod konwersji, w tym:
ConvertTimeFromUtc, który konwertuje czas UTC na czas w wyznaczonej strefie czasowej.
ConvertTimeToUtc, który konwertuje czas w wyznaczonej strefie czasowej na UTC.
ConvertTime, który konwertuje czas w jednej wyznaczonej strefie czasowej na czas w innej wyznaczonej strefie czasowej.
ConvertTimeBySystemTimeZoneId, który używa identyfikatorów strefy czasowej (zamiast TimeZoneInfo obiektów) jako parametrów, aby przekonwertować czas w jednej wyznaczonej strefie czasowej na czas w innej wyznaczonej strefie czasowej.
Aby uzyskać szczegółowe informacje na temat konwertowania czasów między strefami czasowymi, zobacz Konwertowanie czasów między strefami czasowymi.