Partilhar via


Como: Restaurar os fusos horários de um recurso incorporado

Este tópico descreve como restaurar zonas de tempo que foram salvas em um arquivo de recurso. Para obter informações e instruções sobre como salvar zonas de tempo, consulte Como: Salvar os fusos horários para um recurso incorporado.

Para desserializar um objeto TimeZoneInfo de um recurso incorporado

  1. Se a zona de tempo a ser recuperada não for uma zona de tempo personalizada, tente instanciá-la usando o método FindSystemTimeZoneById.

  2. Crie uma instância de um objeto ResourceManager passando o nome totalmente qualificado do arquivo de recurso incorporado e uma referência ao assembly que contém o arquivo de recurso.

    Se você não conseguir determinar o nome totalmente qualificado do arquivo de recurso incorporado, utilize o Ildasm. exe (desmontador MSIL) para examinar o manifesto do assembly. Uma entrada .mresource identifica o recurso. No exemplo, o nome totalmente qualificado do recurso é SerializeTimeZoneData.SerializedTimeZones.

    Se o arquivo de recurso está incorporado no mesmo assembly que contém o código de instanciação da zona de tempo, você pode recuperar uma referência a ele chamando o método static (Shared no Visual Basic) GetExecutingAssembly.

  3. Se a chamada ao método FindSystemTimeZoneById falhar, ou se uma zona de tempo personalizada está para ser instanciada, recupere uma sequência de caracteres que contenha a zona de tempo serializada chamando o método ResourceManager.GetString.

  4. Desserialize os dados da zona de tempo chamando o método FromSerializedString.

Exemplo

O exemplo a seguir desserializa um objeto TimeZoneInfo armazenado em um arquivo XML de recurso .NET incorporado.

Private Sub DeserializeTimeZones()
   Dim cst, palmer As TimeZoneInfo
   Dim timeZoneString As String
   Dim resMgr As ResourceManager = New ResourceManager("SerializeTimeZoneData.SerializedTimeZones", Assembly.GetExecutingAssembly)

   ' Attempt to retrieve time zone from system
   Try
      cst = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")
   Catch ex As TimeZoneNotFoundException
      ' Time zone not in system; retrieve from resource
      timeZoneString = resMgr.GetString("CentralStandardTime")
      If Not String.IsNullOrEmpty(timeZoneString) Then
         cst = TimeZoneInfo.FromSerializedString(timeZoneString)
      Else
         MsgBox("Unable to create Central Standard Time Zone. Application must exit.")
         Exit Sub
      End If
   End Try
   ' Retrieve custom time zone
   Try
      timeZoneString = resMgr.GetString("PalmerStandardTime")
      palmer = TimeZoneInfo.FromSerializedString(timeZoneString)
   Catch ex As Exception
      MsgBox(ex.GetType().Name & ": Unable to create Palmer Standard Time Zone. Application must exit.")
      Exit Sub
   End Try
End Sub
private void DeserializeTimeZones()
{
   TimeZoneInfo cst, palmer;
   string timeZoneString;
   ResourceManager resMgr = new ResourceManager("SerializeTimeZoneData.SerializedTimeZones", Assembly.GetExecutingAssembly());

   // Attempt to retrieve time zone from system
   try
   {
      cst = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
   }
   catch (TimeZoneNotFoundException)
   {
      // Time zone not in system; retrieve from resource
      timeZoneString = resMgr.GetString("CentralStandardTime");
      if (! String.IsNullOrEmpty(timeZoneString))
      {
         cst = TimeZoneInfo.FromSerializedString(timeZoneString);
      }
      else
      {
         MessageBox.Show("Unable to create Central Standard Time Zone. Application must exit.", "Application Error");
         return;
      }
   }
   // Retrieve custom time zone
   try
   {
      timeZoneString = resMgr.GetString("PalmerStandardTime");
      palmer = TimeZoneInfo.FromSerializedString(timeZoneString);
   }
   catch (MissingManifestResourceException) 
   {
      MessageBox.Show("Unable to retrieve the Palmer Standard Time Zone from the resource file. Application must exit.");
      return;
   }
}

Esse código ilustra a manipulação de exceção para garantir que um objeto TimeZoneInfo, exigido pelo aplicativo, esteja presente. Ele primeiro tenta criar uma instância de um objeto TimeZoneInfo, pela recuperação dele a partir do registro, usando o método FindSystemTimeZoneById. Se a zona de tempo não puder ser instanciada, o código a recupera do arquivo de recurso incorporado.

Pelo fato dos dados de zonas de tempo personalizadas (zonas de tempo instanciadas usando-se o método CreateCustomTimeZone) não serem armazenados no registro, o código não chama o FindSystemTimeZoneById para instanciar a zona de tempo para Palmer, Antártica. Em vez disso, ele imediatamente verifica o arquivo de recurso incorporado para recuperar uma sequência de caracteres que contenha os dados da zona de tempo, antes dele chamar o método FromSerializedString.

Compilando o código

Este exemplo requer:

  • Que uma referência a System.Windows.Forms.dll e System.Core.dll seja adicionada ao projeto.

  • Que os seguintes espaços de nome sejam importados:

    Imports System.Globalization
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Globalization;
    using System.IO;
    using System.Reflection;
    using System.Resources;
    using System.Windows.Forms;
    

Consulte também

Tarefas

Como: Salvar os fusos horários para um recurso incorporado

Conceitos

Visão geral do fuso horário

Outros recursos

Datas, horas e fusos horários