Condividi tramite


Procedura: risolvere orari ambigui

Aggiornamento: novembre 2007

Un'ora ambigua è un'ora associata a più ore UTC (Coordinated Universal Time). Si verifica quando l'orario viene portato indietro, ad esempio durante la transizione da ora legale a ora solare del fuso orario. Quando si gestisce un'ora ambigua, è possibile effettuare una delle operazioni seguenti:

  • Fare una supposizione sul modo in cui l'ora viene associata all'ora UTC. Ad esempio, è possibile presupporre che un'ora ambigua sia sempre espressa nell'ora solare del fuso orario.

  • Se l'ora ambigua è un elemento di dati immesso dall'utente, sarà l'utente a risolvere l'ambiguità.

In questo argomento viene descritto come risolvere un'ora ambigua presupponendo che rappresenti l'ora solare del fuso orario.

Per associare un'ora ambigua all'ora solare del fuso orario

  1. Chiamare il metodo IsAmbiguousTime per determinare se l'ora è ambigua.

  2. Se l'ora è ambigua, sottrarre l'ora dall'oggetto TimeSpan restituito dalla proprietà BaseUtcOffset del fuso orario.

  3. Chiamare il metodo SpecifyKindstatic (Shared in Visual Basic .NET) per impostare la proprietà Kind del valore di data e ora UTC su DateTimeKind.Utc.

Esempio

Nell'esempio seguente viene illustrato come convertire un'ora ambigua in un'ora UTC presupponendo che rappresenti l'ora solare del fuso orario locale.

Private Function ResolveAmbiguousTime(ambiguousTime As Date) As Date
   ' Time is not ambiguous
   If Not TimeZoneInfo.Local.IsAmbiguousTime(ambiguousTime) Then 
      Return TimeZoneInfo.ConvertTimeToUtc(ambiguousTime) 
   ' Time is ambiguous
   Else
      Dim utcTime As Date = DateTime.SpecifyKind(ambiguousTime - TimeZoneInfo.Local.BaseUtcOffset, DateTimeKind.Utc)      
      Console.WriteLine("{0} local time corresponds to {1} {2}.", ambiguousTime, utcTime, utcTime.Kind.ToString())
      Return utcTime            
   End If   
End Function
private DateTime ResolveAmbiguousTime(DateTime ambiguousTime)
{
   // Time is not ambiguous
   if (! TimeZoneInfo.Local.IsAmbiguousTime(ambiguousTime))
   { 
      return ambiguousTime; 
   }
   // Time is ambiguous
   else
   {
      DateTime utcTime = DateTime.SpecifyKind(ambiguousTime - TimeZoneInfo.Local.BaseUtcOffset, 
                                              DateTimeKind.Utc);      
      Console.WriteLine("{0} local time corresponds to {1} {2}.", 
                        ambiguousTime, utcTime, utcTime.Kind.ToString());
      return utcTime;            
   }   
}

L'esempio è costituito da un metodo denominato ResolveAmbiguousTime che determina se il valore DateTime passato è ambiguo. Se il valore è ambiguo, il metodo restituisce un valore DateTime che rappresenta l'ora UTC corrispondente. Il metodo gestisce questa conversione sottraendo il valore della proprietà BaseUtcOffset del fuso orario locale dall'ora locale.

In genere, un'ora ambigua viene gestita chiamando il metodo GetAmbiguousTimeOffsets per recuperare una matrice di oggetti TimeSpan contenente i possibili offset UTC dell'ora ambigua. In questo esempio si presuppone che un'ora ambigua sia sempre associata all'ora solare del fuso orario. La proprietà BaseUtcOffset restituisce l'offset tra l'ora UTC e l'ora solare del fuso orario.

In questo esempio, tutti i riferimenti al fuso orario locale vengono eseguiti tramite la proprietà TimeZoneInfo.Local. Il fuso orario locale non viene mai assegnato a una variabile oggetto. È una procedura consigliata poiché una chiamata al metodo TimeZoneInfo.ClearCachedData invalida tutti gli oggetti ai quali è assegnato il fuso orario locale.

Compilazione del codice

Per questo esempio è necessario:

  • Aggiungere un riferimento a System.Core.dll al progetto.

  • Importare lo spazio dei nomi System con l'istruzione using (richiesto nel codice C#).

Vedere anche

Attività

Procedura: consentire agli utenti di risolvere orari ambigui

Altre risorse

Ora e fusi orari