Ich denke, das ist eine ausgezeichnete Frage. (Ich entdeckte es einfach.)
Es sei denn, Sie sind mit Terminen ganz in der Nähe des Jahres 1900 ein DateTime
Betrieb wird eine höhere Präzision als ein OA Datum. Aber aus irgendeinem obskuren Grund, die Autoren der DateTime
Struktur nur Liebe auf die nächste ganze Millisekunde abgeschnitten, wenn sie zwischen DateTime
und etwas anderes zu konvertieren. Unnötig zu sagen, dass dies ohne guten Grund eine Menge Präzision wegwirft.
Hier ist ein Work-around:
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;
}
Nun lassen Sie uns (aus Ihrer Frage) betrachten die DateTime
gegeben durch:
var ourDT = new DateTime(634202170964319073);
// .ToSting("O") gives 2010-09-16T06:58:16.4319073
Die Genauigkeit jeder DateTime
beträgt 0,1 us.
in der Nähe von Datum und Zeit, die wir schätzen, ist die Präzision eines OA Datum:
Math.Pow(2.0, -37.0)
Tage oder circa 0.6286
us
Wir schließen daraus, dass in dieser Region ein DateTime
ist genauer als ein OA-Datum von (knapp über) einem Faktor sechs.
Lassen Sie uns ourDT
-double
konvertieren Jetzt mit meinem Erweiterungsmethode oben
double ourOADate = ourDT.ToOADatePrecise();
// .ToString("G") gives 40437.2904679619
// .ToString("R") gives 40437.290467961888
, wenn Sie ourOADate
zurück zu einem DateTime
mit der statischen FromOADatePrecise
Methode oben konvertieren, erhalten Sie
2010-09-16T06:58:16.4319072
(geschrieben mit "O"
Format)
Im Vergleich zum Original sehen wir, dass der Genauigkeitsverlust in diesem Fall 0,1 μs beträgt. Wir erwarten, dass der Genauigkeitsverlust innerhalb von ± 0,4 μs liegt, da dieses Intervall eine Länge von 0,8 μs hat, was mit den zuvor erwähnten 0,6286 μs vergleichbar ist.
Wenn wir den anderen Weg gehen, beginnend mit einem double
einen OA Datum darstellen, nicht zu nahe an das Jahr 1900, und erste Verwendung FromOADatePrecise
und dannToOADatePrecise
, dann bekommen wir wieder ein double
, und weil Die Präzision des Intermediates DateTime
ist der eines OA-Datums überlegen, wir erwarten in diesem Fall einen perfekten Round-Trip. Wenn Sie andererseits die BCL-Methoden FromOADate
und ToOADate
in der gleichen Reihenfolge verwenden, ist es sehr unwahrscheinlich, eine gute Hin- und Rückfahrt zu bekommen (es sei denn, die von uns begonnene double
hat eine ganz spezielle Form).
Nicht genau Angaben, aber das ist eine Lektüre wert: http://blogs.msdn.com/b/ericlippert/archive/2003/09/16/eric-s-complete-guide-to-vt-date.aspx –
Danke, es scheint eine Menge Geschichte hinter diesem Datumsformat zu stehen ... –