Condividi tramite


Procedura: ripristinare i fusi orari da una risorsa incorporata

In questo argomento viene descritto come ripristinare i fusi orari salvati in un file di risorse. Per informazioni e istruzioni sul salvataggio dei fusi orari, vedere Procedura: salvare fusi orari in una risorsa incorporata.

Per deserializzare un oggetto TimeZoneInfo da una risorsa incorporata

  1. Se il fuso orario da recuperare non è un fuso orario personalizzato, provare a crearne un'istanza utilizzando il metodo FindSystemTimeZoneById.

  2. Creare un'istanza di un oggetto ResourceManager passando il nome completo del file di risorse incorporate e un riferimento all'assembly che contiene il file di risorse.

    Se non è possibile determinare il nome completo del file di risorse incorporate, utilizzare Ildasm.exe (disassemblatore MSIL) per esaminare il manifesto dell'assembly. Una voce .mresource identifica la risorsa. Nell'esempio il nome completo della risorsa è SerializeTimeZoneData.SerializedTimeZones.

    Se il file di risorse è incorporato nello stesso assembly che contiene il codice per la creazione di istanze del fuso orario, è possibile recuperarne un riferimento chiamando il metodo static (Shared in Visual Basic) GetExecutingAssembly.

  3. Se la chiamata al metodo FindSystemTimeZoneById non riesce o se è necessario creare un'istanza di un fuso orario personalizzato, recuperare una stringa che contenga il fuso orario serializzato chiamando il metodo ResourceManager.GetString.

  4. Deserializzare i dati del fuso orario chiamando il metodo FromSerializedString.

Esempio

Nell'esempio seguente viene deserializzato un oggetto TimeZoneInfo archiviato in un file di risorse .NET XML incorporate.

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;
   }
}

In questo codice viene illustrata la gestione delle eccezioni per assicurarsi che sia presente un oggetto TimeZoneInfo richiesto dall'applicazione. Viene innanzitutto tentata la creazione di un'istanza di un oggetto TimeZoneInfo recuperandolo dal Registro di sistema mediante il metodo FindSystemTimeZoneById. Se non è possibile creare un'stanza del fuso orario, il codice lo recupera dal file di risorse incorporate.

Poiché i dati per i fusi orari personalizzati (fusi orari di cui è stata creata un'istanza utilizzando il metodo CreateCustomTimeZone) non vengono archiviati nel Registro di sistema, il codice non chiama il metodo FindSystemTimeZoneById per creare un'istanza del fuso orario per la stazione Palmer Station, Antartide. Cerca invece immediatamente il file di risorse incorporate per recuperare una stringa che contenga i dati del fuso orario prima che venga chiamato il metodo FromSerializedString.

Compilazione del codice

Per questo esempio è necessario:

  • Aggiungere un riferimento a System.Windows.Forms.dll e System.Core.dll al progetto.

  • Importare gli spazi dei nomi seguenti:

    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;
    

Vedere anche

Attività

Procedura: salvare fusi orari in una risorsa incorporata

Concetti

Panoramica sul fuso orario

Altre risorse

Date, ora e fusi orari