Gewusst wie: Instanziieren eines TimeZoneInfo-Objekts
Das gängigste Verfahren zum Instanziieren eines TimeZoneInfo-Objekts besteht darin, Daten über das Objekt aus der Registrierung abzurufen. In diesem Thema wird erläutert, wie ein TimeZoneInfo-Objekt aus der Registrierung des lokalen Systems instanziiert wird.
So instanziieren Sie ein TimeZoneInfo-Objekt
Deklarieren Sie ein TimeZoneInfo-Objekt.
Rufen Sie die static (Shared in Visual Basic) TimeZoneInfo.FindSystemTimeZoneById-Methode auf.
Behandeln Sie mögliche Ausnahmen, die von der Methode ausgelöst werden, insbesondere die TimeZoneNotFoundException, die ausgelöst wird, wenn die Zeitzone nicht in der Registrierung definiert ist.
Beispiel
Mit dem folgenden Code wird ein TimeZoneInfo-Objekt abgerufen, das die Zeitzone Eastern Normalzeit darstellt, und es wird die Eastern Normalzeit angezeigt, die der Ortszeit entspricht.
Dim timeNow As Date = Date.Now
Try
Dim easternZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
Dim easternTimeNow As Date = TimeZoneInfo.ConvertTime(timeNow, TimeZoneInfo.Local, easternZone)
Console.WriteLine("{0} {1} corresponds to {2} {3}.", _
timeNow, _
IIf(TimeZoneInfo.Local.IsDaylightSavingTime(timeNow), _
TimeZoneInfo.Local.DaylightName, TimeZoneInfo.Local.StandardName), _
easternTimeNow, _
IIf(easternZone.IsDaylightSavingTime(easternTimeNow), _
easternZone.DaylightName, easternZone.StandardName))
' Handle exception
'
' As an alternative to simply displaying an error message, an alternate Eastern
' Standard Time TimeZoneInfo object could be instantiated here either by restoring
' it from a serialized string or by providing the necessary data to the
' CreateCustomTimeZone method.
Catch e As TimeZoneNotFoundException
Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.")
Catch e As InvalidTimeZoneException
Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.")
Catch e As SecurityException
Console.WriteLine("The application lacks permission to read time zone information from the registry.")
Catch e As OutOfMemoryException
Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.")
' If we weren't passing FindSystemTimeZoneById a literal string, we also
' would handle an ArgumentNullException.
End Try
DateTime timeNow = DateTime.Now;
try
{
TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime easternTimeNow = TimeZoneInfo.ConvertTime(timeNow, TimeZoneInfo.Local,
easternZone);
Console.WriteLine("{0} {1} corresponds to {2} {3}.",
timeNow,
TimeZoneInfo.Local.IsDaylightSavingTime(timeNow) ?
TimeZoneInfo.Local.DaylightName :
TimeZoneInfo.Local.StandardName,
easternTimeNow,
easternZone.IsDaylightSavingTime(easternTimeNow) ?
easternZone.DaylightName :
easternZone.StandardName);
}
// Handle exception
//
// As an alternative to simply displaying an error message, an alternate Eastern
// Standard Time TimeZoneInfo object could be instantiated here either by restoring
// it from a serialized string or by providing the necessary data to the
// CreateCustomTimeZone method.
catch (TimeZoneNotFoundException)
{
Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.");
}
catch (InvalidTimeZoneException)
{
Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.");
}
catch (SecurityException)
{
Console.WriteLine("The application lacks permission to read time zone information from the registry.");
}
catch (OutOfMemoryException)
{
Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.");
}
// If we weren't passing FindSystemTimeZoneById a literal string, we also
// would handle an ArgumentNullException.
Der einzige Parameter der TimeZoneInfo.FindSystemTimeZoneById-Methode ist der Bezeichner der Zeitzone, die abgerufen werden soll, und entspricht der TimeZoneInfo.Id-Eigenschaft des Objekts. Der Zeitzonenbezeichner ist ein Schlüsselfeld, das die Zeitzone eindeutig kennzeichnet. Die meisten Schlüsselfelder sind relativ kurz, der Zeitzonenbezeichner hingegen vergleichsweise lang. In den meisten Fällen entspricht der Wert des Zeitzonenbezeichners der StandardName-Eigenschaft eines TimeZoneInfo-Objekts, die den Namen der Normalzeit der Zeitzone bereitstellt. Es gibt jedoch auch Ausnahmen. Sie können am ehesten sicherstellen, dass Sie einen gültigen Bezeichner verwenden, indem Sie die im System verfügbaren Zeitzonen auflisten und die Bezeichner der vorhandenen Zeitzonen notieren. Informationen zur Veranschaulichung finden Sie unter Gewusst wie: Auflisten der auf einem Computer vorhandenen Zeitzonen. Das Thema Suchen der auf einem lokalen System definierten Zeitzonen enthält auch eine Liste ausgewählter Zeitzonenbezeichner.
Wenn die Zeitzone gefunden wird, gibt die Methode ihr TimeZoneInfo-Objekt zurück. Wenn die Zeitzone nicht gefunden wird, löst die Methode eine TimeZoneNotFoundException aus. Wenn die Zeitzone gefunden wird, die Daten jedoch beschädigt oder nicht vollständig sind, löst die Methode eine InvalidTimeZoneException aus.
Wenn für die Anwendung eine Zeitzone vorhanden sein muss, sollte zunächst die FindSystemTimeZoneById-Methode aufgerufen werden, um die Zeitzonendaten aus der Registrierung abzurufen. Wenn beim Methodenaufruf ein Fehler auftritt, sollte der Ausnahmehandler entweder eine neue Instanz der Zeitzone erstellen oder die Zeitzone erneut erstellen, indem er ein serialisiertes TimeZoneInfo-Objekt deserialisiert. Ein Beispiel finden Sie unter Gewusst wie: Wiederherstellen von Zeitzonen aus einer eingebetteten Ressource.
Kompilieren des Codes
Für dieses Beispiel ist Folgendes erforderlich:
Dem Projekt muss ein Verweis auf System.Core.dll hinzugefügt werden.
Der System-Namespace muss mit der using-Anweisung (in C#-Code erforderlich) importiert werden.
Siehe auch
Aufgaben
Gewusst wie: Zugreifen auf die vordefinierte UTC und lokale Zeitzonenobjekte
Konzepte
Suchen der auf einem lokalen System definierten Zeitzonen