Je pense que c'est une excellente question. (Je viens de le découvrir.)
est ici un travail autour:
static readonly DateTime oaEpoch = new DateTime(1899, 12, 30);
public static DateTime FromOADatePrecise(double d)
{
if (!(d >= 0))
throw new ArgumentOutOfRangeException(); // NaN or negative d not supported
return oaEpoch + TimeSpan.FromTicks(Convert.ToInt64(d * TimeSpan.TicksPerDay)):
}
public static double ToOADatePrecise(this DateTime dt)
{
if (dt < oaEpoch)
throw new ArgumentOutOfRangeException();
return Convert.ToDouble((dt - oaEpoch).Ticks)/TimeSpan.TicksPerDay;
}
Maintenant, nous allons examiner (de votre question) la DateTime
donnée par:
var ourDT = new DateTime(634202170964319073);
// .ToSting("O") gives 2010-09-16T06:58:16.4319073
La précision de toute DateTime
est de 0,1 ms.
Près de la date et l'heure que nous envisageons, la précision d'une date d'OA est:
Math.Pow(2.0, -37.0)
jours, ou vers 0.6286
ps
Nous concluons que dans cette région un DateTime
est plus précis qu'une date OA par (juste au-dessus) un facteur six.
Convertissons ourDT
-double
en utilisant ma méthode d'extension au-dessus
double ourOADate = ourDT.ToOADatePrecise();
// .ToString("G") gives 40437.2904679619
// .ToString("R") gives 40437.290467961888
Maintenant, si vous convertissez ourOADate
revenir à un DateTime
en utilisant la méthode FromOADatePrecise
statique ci-dessus, vous obtenez
2010-09-16T06:58:16.4319072
(écrit avec "O"
format)
En comparant avec l'original, on constate que la perte de précision est dans ce cas de 0,1 μs. Nous nous attendons à ce que la perte de précision soit de ± 0,4 μs puisque cet intervalle a une longueur de 0,8 μs, ce qui est comparable aux 0,6286 μs mentionnés précédemment.
Si nous dans l'autre sens, en commençant par un double
représentant une date d'OA pas trop proche de l'année 1900, et premier utilisation FromOADatePrecise
et puisToOADatePrecise
, alors nous revenons à un double
, et parce que la précision de l'intermédiaire DateTime
est supérieure à celle d'une date OA, on s'attend à un aller-retour parfait dans ce cas. Si, d'un autre côté, vous utilisez les méthodes BCL FromOADate
et ToOADate
dans le même ordre, il est extrêmement improbable d'obtenir un bon aller-retour (sauf si le double
que nous avons commencé a une forme très spéciale).
Pas exactement les spécifications, mais cela vaut la peine d'être lu: http://blogs.msdn.com/b/ericlippert/archive/2003/09/16/eric-s-complete-guide-to-vt-date.aspx –
Merci, il semble y avoir beaucoup d'histoire derrière ce format de date ... –