2017-07-03 4 views
0

Werden Datetime-Werte mit Mikrosekunden mit genauer Genauigkeit in Double konvertiert?DateTime in Mikrosekunden

Für z. Ich habe Datum als 3 Juli 2017 10:00:00 00 Zecken 636346728000000050. welches in doppelt so umgewandelt wurde, wie ich es bekomme 42919.4166666667. In ähnlicher Weise habe ich die 50 Ticks zum aktuellen Datum hinzugefügt, dh. 3 Juli 2017 10:00:00 00 Ticks 636346728000000100 die in Doppel umgewandelt wurde, bekam auch den gleichen doppelten Wert, aber der Tick-Wert wurde in das Datum hinzugefügt.

Ich bin in doppelsträngige durch dieses Verfahren umgewandelt date.ToOADate()

kann jemand diese bitte lösen?

Vielen Dank im Voraus :)

+1

Es gibt keine "genaue Präzision" in der Messzeit. – vijoc

+0

Warum konvertieren Sie es in ein Doppel? – Magnus

+0

in meiner Anforderung habe ich für einige Operationen in Doppel konvertieren. – Parthiban

Antwort

3

50 Zecken kann nicht in einem OLE-Automatisierung Datum ausgedrückt werden. Dieser Code:

DateTime d1 = DateTime.Parse("3 July 2017 10:00:00"); 
DateTime d2 = d1.AddTicks(100); 
double o2 = d2.ToOADate(); 
Console.WriteLine(o2); 

DateTime d3 = d1.AddTicks(1000); 
double o3 = d3.ToOADate(); 
Console.WriteLine(o3); 

DateTime d4 = d1.AddTicks(10000); 
double o4 = d4.ToOADate(); 
Console.WriteLine(o4); 

erzeugt die Ausgabe:

42919,4166666667 
42919,4166666667 
42919,4166666782 

so benötigen Sie mindestens 10000 Ticks für das Add einen Einfluss zu haben.

+0

In meiner Antwort nahm ich an, dass die Verwendung von ToOADate eine Anforderung war. Wenn ich die Frage noch einmal durchführe, sehe ich, dass die Frage nicht explizit besagt, dass es nur darum geht, eine Datetime in Double umzuwandeln. –

+0

Danke für Ihre Bemühungen. Ja. Ich muss nur die Datetime zu Double konvertieren. Wie Sie gesagt haben, haben nur 10000 Ticks (1 ms) eine Auswirkung. meine Frage ist, gibt es eine andere Möglichkeit, um mit dem Hinzufügen von Mikrosekunden Datum zu konvertieren? – Parthiban

1

Es gibt zwei separate logische Operationen hier:

  • Konvertieren von Zecken zu Mikrosekunden. Dies ist grundsätzlich eine Frage der Division durch 10 (es gibt 100 Nanosekunden oder 0,1 Mikrosekunden in jedem Tick), so dass Informationen bereits in ganzzahliger Arithmetik verloren gehen können - aber das Hinzufügen von 50 Ticks addiert genau 5 Mikrosekunden, so dass dies in Ordnung sein sollte.

  • Konvertierung von einer Ganzzahl in eine binäre Fließkommazahl. Ihr Wert hat 17 signifikante Dezimalziffern, die sich am oberen Ende dessen befinden, was ein 64-Bit-Gleitkomma-Typ darstellen kann. Sie sollten sich nicht auf mehr als 15 signifikante Dezimalstellen verlassen.

Hinzu kommt, dass, verwenden Sie ToOADate, die millisekundengenau zu haben scheint, am reference source suchen.

So:

  • Sie könnten nur Ticks um 10 teilen Mikrosekunden zu bekommen, nur eine geringe Menge an Präzision zu verlieren
  • Sie long-double in einer anderen Art und Weise umwandeln können, die weniger Informationen verlieren als ToOADate, aber Sie werden in vielen Fällen immer noch Informationen verlieren.
  • Wenn Sie durch 10,0 dividieren (also die Integer-Arithmetik vermeiden, um damit zu beginnen), könnten Sie je nach Wert, den Sie darstellen möchten, vermeiden, irgendwelche Informationen zu verlieren.

Wenn Sie in der Lage sind, eine andere Epoche für Ihren double Wert zu wählen, könnte man leicht Mikrosekunden in Werten mit entsprechender Genauigkeit ausdrücken - aber Sie müssen den Bereich der Werte wissen, dass Sie, um auszudrücken müssen zu prüfen das, sowie die Kontrolle über den Rest des Codes unter Verwendung der resultierenden double Werte.

Verwandte Themen