Metodi System.DateTime.ToBinary e FromBinary

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Utilizzare il ToBinary metodo per convertire il valore dell'oggetto corrente DateTime in un valore binario. Successivamente, usare il valore binario e il FromBinary metodo per ricreare l'oggetto originale DateTime .

Importante

In alcuni casi, il DateTime valore restituito dal FromBinary metodo non è identico al valore originale DateTime fornito al ToBinary metodo . Per altre informazioni, vedere la sezione successiva "Regolazione ora locale".

Una DateTime struttura è costituita da un campo privato Kind , che indica se il valore di ora specificato è basato sull'ora locale, sull'ora UTC (Coordinated Universal Time) o su nessuno dei due campi privati Ticks , che contiene il numero di tick da 100 nanosecondi che specificano una data e un'ora.

Regolazione dell'ora locale

Un'ora locale, che è un'ora universale coordinata regolata per il fuso orario locale, è rappresentata da una DateTime struttura la cui Kind proprietà ha il valore Local. Quando si ripristina un valore locale DateTime dalla rappresentazione binaria prodotta dal ToBinary metodo , il FromBinary metodo può modificare il valore ricreato in modo che non sia uguale al valore originale. Ciò può verificarsi nelle seguenti condizioni:

  • Se un oggetto locale viene serializzato in un fuso orario dal ToBinary metodo e quindi deserializzato in un fuso orario diverso dal FromBinary metodo , l'ora locale DateTime rappresentata dall'oggetto risultante DateTime viene adattata automaticamente al secondo fuso orario.

    Si consideri, ad esempio, un DateTime oggetto che rappresenta un'ora locale di 3 P.M. Un'applicazione in esecuzione nel fuso orario pacifico degli Stati Uniti usa il ToBinary metodo per convertire l'oggetto DateTime in un valore binario. Un'altra applicazione in esecuzione nel fuso orario orientale degli Stati Uniti usa quindi il FromBinary metodo per convertire il valore binario in un nuovo DateTime oggetto. Il valore del nuovo DateTime oggetto è 6 P.M., che rappresenta lo stesso punto nel tempo del valore originale delle 3 P.M. ma viene regolato in base all'ora locale nel fuso orario orientale.

  • Se la rappresentazione binaria di un valore locale DateTime rappresenta un'ora non valida nel fuso orario locale del sistema in cui FromBinary viene chiamato, l'ora viene modificata in modo che sia valida.

    Ad esempio, la transizione dall'ora solare all'ora legale si verifica nel fuso orario Pacifico del Stati Uniti il 14 marzo 2010, alle 2:00, quando l'ora avanza di un'ora, alle 3:00. Questo intervallo di ora è un'ora non valida, ovvero un intervallo di tempo che non esiste in questo fuso orario. Nell'esempio seguente viene illustrato che quando un'ora compresa in questo intervallo viene convertita in un valore binario dal ToBinary metodo e quindi ripristinata dal FromBinary metodo , il valore originale viene modificato in modo da diventare un'ora valida. È possibile determinare se un determinato valore di data e ora può essere soggetto a modifiche passandolo al TimeZoneInfo.IsInvalidTime metodo , come illustrato nell'esempio.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          DateTime localDate = new DateTime(2010, 3, 14, 2, 30, 0, DateTimeKind.Local);
          long binLocal = localDate.ToBinary();
          if (TimeZoneInfo.Local.IsInvalidTime(localDate))
             Console.WriteLine("{0} is an invalid time in the {1} zone.",
                               localDate,
                               TimeZoneInfo.Local.StandardName);
    
          DateTime localDate2 = DateTime.FromBinary(binLocal);
          Console.WriteLine("{0} = {1}: {2}",
                            localDate, localDate2, localDate.Equals(localDate2));
       }
    }
    // The example displays the following output:
    //    3/14/2010 2:30:00 AM is an invalid time in the Pacific Standard Time zone.
    //    3/14/2010 2:30:00 AM = 3/14/2010 3:30:00 AM: False
    
    open System
    
    let localDate = DateTime(2010, 3, 14, 2, 30, 0, DateTimeKind.Local)
    let binLocal = localDate.ToBinary()
    if TimeZoneInfo.Local.IsInvalidTime localDate then
        printfn $"{localDate} is an invalid time in the {TimeZoneInfo.Local.StandardName} zone."
    
    let localDate2 = DateTime.FromBinary binLocal
    printfn $"{localDate} = {localDate2}: {localDate.Equals localDate2}"
    
    // The example displays the following output:
    //    3/14/2010 2:30:00 AM is an invalid time in the Pacific Standard Time zone.
    //    3/14/2010 2:30:00 AM = 3/14/2010 3:30:00 AM: False
    
    Module Example
       Public Sub Main()
          Dim localDate As Date = DateTime.SpecifyKind(#03/14/2010 2:30AM#, DateTimeKind.Local)
          Dim binLocal As Long = localDate.ToBinary()
          If TimeZoneInfo.Local.IsInvalidTime(localDate) Then
             Console.WriteLine("{0} is an invalid time in the {1} zone.", _
                               localDate, _
                               TimeZoneInfo.Local.StandardName)
          End If
          Dim localDate2 As Date = DateTime.FromBinary(binLocal)
          Console.WriteLine("{0} = {1}: {2}", _
                            localDate, localDate2, localDate.Equals(localDate2))
       End Sub
    End Module
    ' The example displays the following output:
    '    3/14/2010 2:30:00 AM is an invalid time in the Pacific Standard Time zone.
    '    3/14/2010 2:30:00 AM = 3/14/2010 3:30:00 AM: False