2017-12-09 4 views
4

Hi. Ich versuche, einen eingehenden datetime-Wert zu konvertieren, der in einem String-Format zu unserem System kommt. Es scheint, dass, wenn die Genauigkeit von Millisekunden höher als 7 ist, das Date-Time-Parsing in .NET den Wert nicht zu mögen scheint und den Wert nicht konvertieren/analysieren kann. Ich bin ein bisschen fest, was ich dafür tun soll? Mein einziger aktueller Gedanke ist, dass es eine Grenze für die Millisekundengröße gibt und dass mehr Präzision nicht möglich ist? Aber ich möchte bestätigen, dass dies der Fall ist, anstatt davon auszugehen. Beispiel:.NET datetime Millisekunden-Genauigkeitsproblem beim Konvertieren von Zeichenfolge in Datetime

string candidateDateTimeString = "2017-12-08T15:14:38.123456789Z"; 
if (!success) 
     { 
      success = DateTime.TryParseExact(trayportDateTimeString, "yyyy- 
MM-dd'T'HH:mm:ss.fffffffff'Z'", 
       CultureInfo.InvariantCulture, dateTimeStyles, out dateTime); 
     } 

Wenn ich die 'f' Werte auf nur 7, dann Datum Zeit Parsing funktioniert reduzieren. Gibt es eine Grenze? Oder mache ich etwas offensichtlich falsch?

+0

DateTime hat Genauigkeit bis zu 7 Ziffern, alle nachfolgenden können sowieso nicht dort gespeichert werden, deshalb ist ein solches Format nicht erlaubt. – Evk

+1

Die kleinste Zeit, die DateTime speichern kann, ist 100 Nanosekunden. Das sind 7 Ziffern in der Fraktion. Anstatt die achte und folgende Ziffer einfach still zu ignorieren, wird es Ihnen sagen, dass Sie es falsch machen. Dies stellt sicher, dass Sie, wenn Sie jemals wieder zu einer Zeichenfolge zurückkehren, genau die gleichen Ziffern erhalten. Zuverlässige Rundauslösung ist wichtig. Und außerdem kannst du dir keine Uhr leisten, die so genau ist, es ist nicht die Art von Ausrüstung, die du in deinem Keller hast. –

Antwort

0

Präzision von Datums- und Zeitwerte komplexer ist, als Sie vielleicht denken. Es gibt verschiedene Ebenen der Präzision beteiligt: ​​

Präzision der DateTime

DateTime speichert die Anzahl der Ticks seit 01.01.0001 00.00 als 64-Bit-Wert. Ein Tick ist 100 Nanosekunden. Da dies die maximale Genauigkeit ist, die gespeichert werden kann, macht es keinen Sinn, mit einer höheren Genauigkeit zu formatieren. Sie können einfach so viele Nullen hinzufügen, wie für eine höhere Genauigkeit erforderlich sind. Wenn Sie kürzere Zeitspannen als 100 Nanosekunden darstellen müssen, müssen Sie einen anderen Typ verwenden, z. B. Int64 mit einer benutzerdefinierten Tick-Größe.

Präzision der DateTime.Now

Wenn Sie DateTime.Now rufen Sie eine viel geringere Präzision bekommen als DateTime speichern kann. Der genaue Wert hängt vom Systemtakt ab, liegt jedoch normalerweise im Millisekundenbereich.

Präzision der Stopwatch

Wenn Sie die Zeit mit Stopwatch messen, abhängig von Ihrem System, können Sie die Zeit von einem Hochleistungs-Takt erhalten, die genauer als die Uhr für DateTime.Now verwendet, aber immer noch weniger als 100 Nanosekunden. Bei einem System ohne Hochleistungsuhr ist die Genauigkeit diejenige der regulären Systemuhr., Macht nicht viel praktischen Sinn

Zusammenfassung

Sofern der Wert, den Sie stammt aus einer hochpräzisen Takt (wie eine Atomuhr) parsen, um es in die volle Genauigkeit von DateTime Parsen. Und wenn es von einer solchen Quelle kommt, müssen Sie auf einen anderen Datentyp zurückgreifen, um den Wert darzustellen.

Verwandte Themen