Методы System.DateTime.ToBinary и FromBinary

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

ToBinary Используйте метод для преобразования значения текущего DateTime объекта в двоичное значение. Затем используйте двоичное значение и FromBinary метод для повторного создания исходного DateTime объекта.

Важно!

В некоторых случаях значение, возвращаемое методом, DateTime не идентично исходному DateTime значению, предоставленному методуToBinary.FromBinary Дополнительные сведения см. в следующем разделе "Настройка локального времени".

DateTime Структура состоит из частного Kind поля, указывающего, основано ли указанное значение времени на основе локального времени, координированного универсального времени (UTC) или ни того, ни сцепленного с частным Ticks полем, которое содержит число 100-наносекундовых галок, указывающих дату и время.

Корректировка локального времени

Локальное время, которое является согласованным универсальным временем, адаптированным к местному часовому поясу, представлено DateTime структурой, свойство которой Kind имеет значение Local. При восстановлении локального DateTime значения из двоичного представления, созданного ToBinary методом, метод может изменить повторно созданное значение, FromBinary чтобы оно не равно исходному значению. Это может произойти в следующих случаях.

  • Если локальный DateTime объект сериализуется в одном часовом поясе методом, а затем десериализирован в другом FromBinary часовом поясе ToBinary методом, то локальное время, представленное результирующий DateTime объект, автоматически настраивается на второй часовой пояс.

    Например, рассмотрим DateTime объект, представляющий локальное время 3 ВЕЧЕРА. Приложение, выполняемое в часовом поясе США, использует ToBinary метод для преобразования этого DateTime объекта в двоичное значение. Другое приложение, выполняемое в часовом поясе США, затем использует FromBinary метод для преобразования двоичного значения в новый DateTime объект. Значение нового DateTime объекта равно 6 P.M., которое представляет тот же момент времени, что и исходное значение 3 ВЕЧЕРА, но корректируется на локальное время в восточном часовом поясе.

  • Если двоичное представление локального DateTime значения представляет недопустимое время в локальном часовом поясе системы, в которой FromBinary вызывается, время корректируется таким образом, чтобы оно было допустимым.

    Например, переход с стандартного времени на летнее время происходит в часовом поясе тихоокеанского времени США 14 марта 2010 года в 2:00, когда время увеличивается на один час до 3:00 утра. Этот интервал часа является недопустимым временем, то есть интервалом времени, который не существует в этом часовом поясе. В следующем примере показано, что когда время, которое попадает в этот диапазон, преобразуется в двоичное значение ToBinary методом и затем восстанавливается FromBinary методом, исходное значение корректируется, чтобы стать допустимым временем. Можно определить, может ли определенное значение даты и времени изменяться, передав его методу TimeZoneInfo.IsInvalidTime , как показано в примере.

    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