Procedura: Risolvere orari ambigui

Un'ora ambigua è un'ora associata a più ore UTC (Coordinated Universal Time). Si verifica quando l'orologio viene riportato indietro, ad esempio durante la transizione dall'ora legale all'ora solare di un determinato fuso orario. Quando si gestisce un'ora ambigua è possibile eseguire una delle operazioni seguenti:

  • Fare una supposizione sulla modalità di associazione dell'ora all'ora UTC. Si può, ad esempio, 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 illustrato come risolvere un'ora ambigua presupponendo che rappresenti l'ora solare del fuso orario.

Per eseguire il mapping di 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 static (Shared in Visual Basic .NET) SpecifyKind per impostare la proprietà Kind di data e ora UTC su DateTimeKind.Utc.

Esempio

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

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

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 contenenti i possibili offset dall'ora UTC dell'ora ambigua. Tuttavia, in questo esempio si presuppone che un'ora ambigua deve sempre essere mappata all'ora solare del fuso orario. La proprietà BaseUtcOffset restituisce l'offset tra l'ora UTC e l'ora solare di un fuso orario.

In questo esempio, tutti i riferimenti al fuso orario locale vengono eseguiti mediante la proprietà TimeZoneInfo.Local. Il fuso orario locale non viene mai assegnato a una variabile oggetto. Si tratta di una procedura consigliata perché una chiamata al metodo TimeZoneInfo.ClearCachedData invalida tutti gli oggetti a cui è assegnato il fuso orario locale.

Compilazione del codice

L'esempio presenta i requisiti seguenti:

  • Che lo spazio dei nomi System verrà importato con l'istruzione using (obbligatoria nel codice C#).

Vedi anche