Поделиться через


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

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

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

Это важно

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

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

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

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

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

    Например, рассмотрим DateTime объект, представляющий локальное время 3 вечера. Приложение, выполняемое в Тихоокеанском времени США, использует ToBinary метод для преобразования этого DateTime объекта в двоичное значение. Другое приложение, выполняемое в часовом поясе США, затем использует FromBinary метод для преобразования двоичного значения в новый DateTime объект. Значение нового объекта DateTime равно 18:00, что представляет тот же момент времени, что и исходное значение 15:00, но приведено в соответствие с восточным временем.

  • Если двоичное представление локального 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($"{localDate} is an invalid time in the {TimeZoneInfo.Local.StandardName} zone.");
    
          DateTime localDate2 = DateTime.FromBinary(binLocal);
          Console.WriteLine($"{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