Share via


Cómo: Crear instancias de un objeto TimeZoneInfo

Actualización: noviembre 2007

La manera más común de crear instancias de un objeto TimeZoneInfo es recuperar la información sobre él en el Registro. En este tema se explica cómo crear instancias de un objeto TimeZoneInfo a partir del Registro del sistema local.

Para crear instancias de un objeto TimeZoneInfo

  1. Declare un objeto TimeZoneInfo.

  2. Llame al método TimeZoneInfo.FindSystemTimeZoneByIdstatic (Shared en Visual Basic).

  3. Trate las excepciones producidas por el método, especialmente la excepción TimeZoneNotFoundException, que se produce si la zona horaria no está definida en el Registro.

Ejemplo

El código siguiente 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.

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.

El parámetro único del método TimeZoneInfo.FindSystemTimeZoneById es el identificador de la zona horaria que desea recuperar, que corresponde a la propiedad TimeZoneInfo.Id del objeto. El identificador de zona horaria es un campo de 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 estar seguro de proporcionar un identificador válido es enumerar las zonas horarias disponibles en el sistema y anotar los identificadores de las zonas horarias presentes. Para obtener un ejemplo, vea Cómo: Enumerar zonas horarias presentes en un equipo. El tema Buscar las zonas horarias definidas en un sistema local también contiene una lista de identificadores de zona horaria seleccionados.

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 excepción TimeZoneNotFoundException. Si se encuentra la zona horaria pero los datos están dañados o no están completos, el método produce una excepción InvalidTimeZoneException.

Si la aplicación necesita que una zona horaria esté presente, debe llamar primero al método FindSystemTimeZoneById para recuperar la información de la 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 deserializando un objeto TimeZoneInfo serializado. Vea Cómo: Restaurar zonas horarias de un recurso incrustado para obtener un ejemplo.

Compilar el código

Para este ejemplo se necesita:

  • Que se agregue al proyecto una referencia a System.Core.dll.

  • Que se importe el espacio de nombres System con la instrucción using (necesaria en código de C#).

Vea también

Tareas

Cómo: Obtener acceso a los objetos de zona horaria local y UTC predefinidos

Conceptos

Buscar las zonas horarias definidas en un sistema local

Otros recursos

Horas y zonas horarias