Méthodes System.DateTime.ToBinary et FromBinary
Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.
Utilisez la ToBinary méthode pour convertir la valeur de l’objet actuel DateTime en valeur binaire. Ensuite, utilisez la valeur binaire et la FromBinary méthode pour recréer l’objet d’origine DateTime .
Important
Dans certains cas, la DateTime valeur retournée par la FromBinary méthode n’est pas identique à la valeur d’origine DateTime fournie à la ToBinary méthode. Pour plus d’informations, consultez la section suivante, « Ajustement de l’heure locale ».
Une DateTime structure se compose d’un champ privé Kind , qui indique si la valeur de temps spécifiée est basée sur l’heure locale, l’heure universelle coordonnée (UTC) ou aucune, concaténée vers un champ privé Ticks , qui contient le nombre de cycles de 100 nanosecondes qui spécifient une date et une heure.
Ajustement de l’heure locale
Une heure locale, qui est une heure universelle coordonnée ajustée au fuseau horaire local, est représentée par une DateTime structure dont Kind la propriété a la valeur Local. Lors de la restauration d’une valeur locale DateTime à partir de la représentation binaire produite par la ToBinary méthode, la FromBinary méthode peut ajuster la valeur recréée afin qu’elle ne soit pas égale à la valeur d’origine. Cela peut se produire dans les conditions suivantes :
Si un objet local DateTime est sérialisé dans un fuseau horaire par la ToBinary méthode, puis désérialisé dans un autre fuseau horaire par la FromBinary méthode, l’heure locale représentée par l’objet résultant DateTime est automatiquement ajustée au deuxième fuseau horaire.
Par exemple, considérez un DateTime objet qui représente une heure locale de 3 heures. Une application qui s’exécute dans le fuseau horaire américain pacifique utilise la ToBinary méthode pour convertir cet DateTime objet en valeur binaire. Une autre application qui s’exécute dans le fuseau horaire est américain utilise ensuite la FromBinary méthode pour convertir la valeur binaire en un nouvel DateTime objet. La valeur du nouvel DateTime objet est 6 p.M., qui représente le même point dans le temps que la valeur initiale de 3 P.M. mais est ajustée à l’heure locale dans le fuseau horaire est.
Si la représentation binaire d’une valeur locale DateTime représente une heure non valide dans le fuseau horaire local du système sur lequel FromBinary est appelé, l’heure est ajustée afin qu’elle soit valide.
Par exemple, la transition entre l’heure standard et l’heure d’été se produit dans le fuseau horaire pacifique du États-Unis le 14 mars 2010, à 2 h 00, lorsque l’heure avance d’une heure à 3 h 00. Cet intervalle d’heure est une heure non valide, autrement dit un intervalle de temps qui n’existe pas dans ce fuseau horaire. L’exemple suivant montre que lorsqu’une heure comprise dans cette plage est convertie en valeur binaire par la ToBinary méthode, puis restaurée par la FromBinary méthode, la valeur d’origine est ajustée pour devenir une heure valide. Vous pouvez déterminer si une valeur de date et d’heure particulière peut être soumise à une modification en la transmettant à la TimeZoneInfo.IsInvalidTime méthode, comme l’illustre l’exemple.
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