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