Métodos System.DateTime.ToBinary y FromBinary
En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.
Utilice el ToBinary método para convertir el valor del objeto actual DateTime en un valor binario. Posteriormente, use el valor binario y el FromBinary método para volver a crear el objeto original DateTime .
Importante
En algunos casos, el DateTime valor devuelto por el FromBinary método no es idéntico al valor original DateTime proporcionado al ToBinary método . Para obtener más información, vea la sección siguiente, "Ajuste de hora local".
Una DateTime estructura consta de un campo privado Kind , que indica si el valor de hora especificado se basa en la hora local, la hora universal coordinada (UTC) o ninguna, concatenada en un campo privado Ticks , que contiene el número de tics de 100 nanosegundos que especifican una fecha y hora.
Ajuste de hora local
Una hora local, que es una hora universal coordinada ajustada a la zona horaria local, se representa mediante una DateTime estructura cuya Kind propiedad tiene el valor Local. Al restaurar un valor local DateTime a partir de la representación binaria generada por el ToBinary método , el FromBinary método puede ajustar el valor recreado para que no sea igual al valor original. Esta desincronización puede aparecer bajo las condiciones siguientes:
Si el método serializa un objeto local DateTime en una zona ToBinary horaria y, a continuación, se deserializa en una zona horaria diferente por el FromBinary método , la hora local representada por el objeto resultante DateTime se ajusta automáticamente a la segunda zona horaria.
Por ejemplo, considere un DateTime objeto que representa una hora local de 3 p.m. Una aplicación que se ejecuta en la zona horaria del Pacífico de EE. UU. usa el ToBinary método para convertir ese DateTime objeto en un valor binario. Otra aplicación que se ejecuta en la zona horaria este de EE. UU. usa el método para convertir el FromBinary valor binario en un nuevo DateTime objeto. El valor del nuevo DateTime objeto es 6 P.M., que representa el mismo punto en el tiempo que el valor original de 3 P.M. pero se ajusta a la hora local en la zona horaria del Este.
Si la representación binaria de un valor local DateTime representa una hora no válida en la zona horaria local del sistema en el que FromBinary se llama, la hora se ajusta para que sea válida.
Por ejemplo, la transición del horario estándar al horario de verano se produce en la zona horaria del Pacífico del Estados Unidos el 14 de marzo de 2010, a las 2:00 A.M., cuando la hora avanza en una hora, a las 3:00 a.m. Este intervalo de hora es una hora no válida, es decir, un intervalo de tiempo que no existe en esta zona horaria. En el ToBinary ejemplo siguiente se muestra que cuando el método convierte una hora que se encuentra dentro de este intervalo en un valor binario y, a continuación, se restaura mediante el FromBinary método , el valor original se ajusta para convertirse en una hora válida. Puede determinar si un valor de fecha y hora determinado puede estar sujeto a modificaciones pasandolo al TimeZoneInfo.IsInvalidTime método , como se muestra en el ejemplo.
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