Compartir a través de


Procedimiento para obtener un objeto TimeZoneInfo

La manera más común para obtener un objeto TimeZoneInfo es recuperar información sobre él del registro. Para obtener el objeto, llame al método static (Shared en Visual Basic) TimeZoneInfo.FindSystemTimeZoneById, que busca en el registro. Controle las excepciones que genere el método, especialmente la excepción TimeZoneNotFoundException que se produce si la zona horaria no está definida en el registro.

Nota:

A partir de .NET 8, TimeZoneInfo.FindSystemTimeZoneById devuelve un objeto TimeZoneInfo almacenado en caché en lugar de crear instancias de un nuevo objeto. Para obtener más información, vea FindSystemTimeZoneById no devuelve un nuevo objeto.

Ejemplo

El siguiente código recupera un objeto TimeZoneInfo que representa la zona horaria estándar del Este y muestra la hora estándar del Este que corresponde a la 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

El único parámetro del método TimeZoneInfo.FindSystemTimeZoneById es el identificador de la zona horaria que quiere recuperar, que se corresponde con la propiedad TimeZoneInfo.Id del objeto. El identificador de zona horaria es un campo clave que identifica de forma única la zona horaria. Aunque la mayoría de las claves son relativamente cortas, el identificador de zona horaria es comparativamente largo. En la mayoría de los casos, su valor corresponde a la propiedad StandardName de un objeto TimeZoneInfo , que se utiliza para proporcionar el nombre de la hora estándar de la zona horaria. Sin embargo, hay excepciones. La mejor manera de asegurarse de que se proporciona un identificador válido es enumerar las zonas horarias disponibles en el sistema y anotar los identificadores de las zonas horarias que figuran en ellas. Para obtener un ejemplo, vea How to: Enumerate time zones present on a computer. El artículo Buscar las zonas horarias definidas en un sistema local también contiene una lista de los identificadores de la zona horaria seleccionada.

Si se encuentra la zona horaria, el método devuelve su objeto TimeZoneInfo . Si no se encuentra la zona horaria, el método produce una TimeZoneNotFoundException. Si se encuentra la zona horaria, pero sus datos están dañados o incompletos, el método produce una InvalidTimeZoneException.

Si la aplicación se basa en una zona horaria que debe estar presente, debe llamar primero al método FindSystemTimeZoneById para recuperar la información de zona horaria del registro. Si se produce un error en la llamada al método, el controlador de excepciones debe crear una nueva instancia de la zona horaria o volver a crearla mediante la deserialización de un objeto TimeZoneInfo serializado. Consulte Procedimiento para restaurar zonas horarias de un recurso incrustado para ver un ejemplo.

Consulte también