Dela via


Så här hämtar du ett TimeZoneInfo-objekt

Det vanligaste sättet att hämta ett TimeZoneInfo objekt är att hämta information om det från registret. Om du vill hämta objektet anropar static du metoden (Shared i Visual Basic), TimeZoneInfo.FindSystemTimeZoneById som söker i registret. Hantera eventuella undantag som genereras av metoden, särskilt de TimeZoneNotFoundException som genereras om tidszonen inte har definierats i registret.

Kommentar

Från och med .NET 8 TimeZoneInfo.FindSystemTimeZoneById returnerar ett cachelagrat TimeZoneInfo objekt i stället för att instansiera ett nytt objekt. Mer information finns i FindSystemTimeZoneById returnerar inte nytt objekt.

Exempel

Följande kod hämtar ett TimeZoneInfo objekt som representerar tidszonen Eastern Standard och visar den eastern standardtid som motsvarar den lokala tiden.

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.
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

Metodens TimeZoneInfo.FindSystemTimeZoneById enda parameter är identifieraren för den tidszon som du vill hämta, vilket motsvarar objektets TimeZoneInfo.Id egenskap. Tidszonsidentifieraren är ett nyckelfält som unikt identifierar tidszonen. Även om de flesta nycklar är relativt korta är tidszonsidentifieraren jämförelsevis lång. I de flesta fall motsvarar dess värde egenskapen för StandardName ett TimeZoneInfo objekt, som används för att ange namnet på tidszonens standardtid. Det finns dock några undantag. Det bästa sättet att se till att du anger en giltig identifierare är att räkna upp de tidszoner som är tillgängliga i systemet och notera identifierarna för de tidszoner som finns på dem. En bild finns i Så här räknar du upp tidszoner som finns på en dator. Artikeln Hitta tidszoner som definierats i ett lokalt system innehåller också en lista över valda tidszonsidentifierare.

Om tidszonen hittas returnerar metoden objektet TimeZoneInfo . Om tidszonen inte hittas genererar metoden en TimeZoneNotFoundException. Om tidszonen hittas men dess data är skadade eller ofullständiga genererar metoden en InvalidTimeZoneException.

Om ditt program förlitar sig på en tidszon som måste finnas bör du först anropa FindSystemTimeZoneById metoden för att hämta tidszonsinformationen från registret. Om metodanropet misslyckas bör undantagshanteraren antingen skapa en ny instans av tidszonen eller återskapa den genom att deserialisera ett serialiserat TimeZoneInfo objekt. Se Så här återställer du tidszoner från en inbäddad resurs för ett exempel.

Se även