Partilhar via


Como: Obter um objeto TimeZoneInfo

A maneira mais comum de obter um TimeZoneInfo objeto é recuperar informações sobre ele do registro. Para obter o objeto, chame o static método (Shared no Visual Basic), TimeZoneInfo.FindSystemTimeZoneById que procura no registro. Manipule quaisquer exceções lançadas pelo método, particularmente as TimeZoneNotFoundException que são lançadas se o fuso horário não estiver definido no registro.

Nota

A partir do .NET 8, TimeZoneInfo.FindSystemTimeZoneById retorna um objeto armazenado em TimeZoneInfo cache em vez de instanciar um novo objeto. Para obter mais informações, consulte FindSystemTimeZoneById doesn't return new object.

Exemplo

O código a seguir recupera um TimeZoneInfo objeto que representa o fuso horário padrão do leste e exibe a hora padrão do leste que corresponde à hora local.

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

O TimeZoneInfo.FindSystemTimeZoneById único parâmetro do método é o identificador do fuso horário que você deseja recuperar, que corresponde à propriedade do TimeZoneInfo.Id objeto. O identificador de fuso horário é um campo-chave que identifica exclusivamente o fuso horário. Embora a maioria das chaves seja relativamente curta, o identificador de fuso horário é comparativamente longo. Na maioria dos casos, seu valor corresponde à StandardName propriedade de um TimeZoneInfo objeto, que é usado para fornecer o nome da hora padrão do fuso horário. No entanto, existem exceções. A melhor maneira de garantir que você forneça um identificador válido é enumerar os fusos horários disponíveis em seu sistema e anotar os identificadores dos fusos horários presentes neles. Para obter uma ilustração, consulte Como enumerar fusos horários presentes em um computador. O artigo Localizando os fusos horários definidos em um sistema local também contém uma lista de identificadores de fuso horário selecionados.

Se o fuso horário for encontrado, o método retornará seu TimeZoneInfo objeto. Se o fuso horário não for encontrado, o método lançará um TimeZoneNotFoundExceptionarquivo . Se o fuso horário for encontrado, mas seus dados estiverem corrompidos ou incompletos, o método lançará um InvalidTimeZoneExceptionarquivo .

Se seu aplicativo depende de um fuso horário que deve estar presente, você deve primeiro chamar o FindSystemTimeZoneById método para recuperar as informações de fuso horário do registro. Se a chamada de método falhar, seu manipulador de exceção deverá criar uma nova instância do fuso horário ou recriá-la desserializando um objeto serializado TimeZoneInfo . Consulte Como: Restaurar fusos horários de um recurso incorporado para obter um exemplo.

Consulte também