System.DateTime.ToBinary 和 FromBinary 方法

本文提供此 API 參考文件的補充備註。

ToBinary使用 方法,將目前DateTime物件的值轉換為二進位值。 接著,使用二進位值和 FromBinary 方法來重新建立原始 DateTime 物件。

重要

在某些情況下,DateTime方法傳FromBinary回的值與提供給 ToBinary 方法的原始DateTime值不同。 如需詳細資訊,請參閱下一節的。

DateTime結構是由私Kind用欄位所組成,這個欄位表示指定的時間值是以當地時間、國際標準時間(UTC)或兩者為基礎,或兩者都與私Ticks用字段串連,其中包含指定日期和時間的 100 奈秒刻度數目。

當地時間調整

當地時間,這是調整為當地時區的國際標準時間,其DateTime屬性具有 值Local的結構Kind表示。 從方法所產生的ToBinary二進位表示法還原本機DateTime值時,方法可能會調整重新建立的值,FromBinary使其不等於原始值。 在下列狀況下可能會發生這種情形:

  • 如果方法以某個時區ToBinary串行化本機DateTime對象,然後由 FromBinary 方法還原串行化在不同的時區,則產生的DateTime物件所代表的當地時間會自動調整為第二個時區。

    例如,假設物件 DateTime 代表當地時間下午 3 點。在美國太平洋時區執行的應用程式會使用 ToBinary 方法將該 DateTime 物件轉換成二進位值。 另一個在美國東部時區執行的應用程式接著會使用 FromBinary 方法,將二進位值轉換成新的 DateTime 物件。 新 DateTime 物件的值為下午 6 點,代表與原始下午 3 點值相同的時間點,但會調整為東部時區的當地時間。

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

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