共用方式為


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 物件的值為下午 6 點,代表與原始下午 3 點值相同的時間點,但會調整為東部時區的當地時間。

  • 如果本機 DateTime 值的二進位表示法代表的時間在呼叫 FromBinary 的系統當地時區中無效,則會將時間調整為有效。

    例如,從標準時間到日光節約時間的轉換,於 2010 年 3 月 14 日在美國太平洋時區發生,時間從上午 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