本文提供此 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: Falseopen 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: FalseModule 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