So erhalten Sie die Genauigkeit mit DateTime.Now.Ticks in C #

7

Ich weiß, wenn ich DateTime.Now.Ticks in C # verwende, gibt es einen langen Wert zurück, aber ich muss es in einer int-Variablen speichern, und ich bin verwirrt, ob ich diese Genauigkeit beibehalten kann oder nicht. Im Moment habe ich nur einen Cast

%Vor%

Das ist eine Projektbeschränkung, also verstehe ich, dass es eine Menge Genauigkeit verloren hat. Ich denke, ich konnte mir einfach keinen anderen Weg vorstellen, ein Timestamp-Ding zu machen, das in einem Int gespeichert ist, das ich dann mit anderen Zeitstempeln vergleichen könnte.

Wünschenswerte Vorschläge oder Ratschläge, wie die Präzision möglichst erhalten werden könnte, wären sehr willkommen.

Alle Antworten waren illustrativ. Ich habe am Ende nur einen Prozess mit Zählern eingerichtet, bei dem ein Zähler auf '0' gesetzt wird und alle anderen Zähler um 1 inkrementiert werden. Dann ist, was auch immer der höchste Zähler ist, der nächste zu verwendende Punkt.

    
ihtkwot 22.04.2010, 22:55
quelle

5 Antworten

10

Benötigen Sie alle höchstwertigen Bits? (z. B. welches Jahr)

Benötigen Sie alle niedrigstwertigen Bits? (z. B. Sub-Nanosekunden-Genauigkeit)

Wie lange brauchen Sie ein Intervall um zu messen?

Wenn Sie nur eine Millisekunden-Genauigkeit benötigen, verlieren Sie nicht die geringstwertigen Bits

%Vor%

bearbeite

Das OP möchte die Zeiten der zuletzt verwendeten Objekte speichern: Wenn dies die Benutzerauswahl für einen einzelnen Benutzer ist, möchten Sie wahrscheinlich nichts kürzer als eine Sekunde! Da es 10 ^ 7 Ticks pro Sekunde gibt, gibt es log (10 ^ 7) / log (2) = 23 überschüssige Bits im langen Wert!

Wie viel Platz benötigen Sie? Nun, Ihre Werte sollten Jahr, Monat, Tag, Stunde, Minute und Sekunde angeben; Es gibt ungefähr 32 Millionen Sekunden in einem Jahr = ungefähr 24 Bits. Fügen Sie 3 Bits hinzu, wenn Sie die letzten 10 Jahre speichern möchten. So wird leicht in einen Int32 passen. Ich würde vorschlagen,

%Vor%     
Sanjay Manohar 23.04.2010, 00:58
quelle
13

DateTime.Now ist nicht so genau.

Ссылка

Wenn Sie den Wert auf einen kleineren Typ festlegen, können Sie in der Regel Daten in jeder Situation verlieren.

Betrachten Sie diese Ausgabe:

%Vor%

Wie wird das auf eine realistische Option reduziert?

    
Anthony Pegram 22.04.2010 22:59
quelle
2

Wenn eine Auflösung von einer Millisekunde ausreicht, können Sie Offsets von einigen Basis DataTime in Ihrem int Feld speichern und dann ein vollständiges DateTime rekonstruieren, wenn Sie es brauchen. Millisekunden, die in einer 32-Bit-Ganzzahl gespeichert sind, können Ihre Anwendung 49 Tage lang ausführen, bevor sie umschlossen wird. Hier ist eine einfache Hilfsklasse, die Sie verwenden könnten:

%Vor%

Es kann wie folgt verwendet werden:

%Vor%     
dewald 23.04.2010 00:25
quelle
2

Mehr für Kicks als alles andere ... Wenn Sie ints verwenden, um Ihre DateTime zu speichern und die Genauigkeit beizubehalten, könnten Sie Ihre eigene Struktur definieren, die zwei Ints mit jeweils 4 Bytes und eine DateTime enthält, die diese teilt Bytes.

%Vor%     
statenjason 23.04.2010 15:38
quelle
1

In Bezug auf meinen obigen Kommentar. Was genau ist die Einschränkung? Wenn die Einschränkung ist, dass Sie die Daten nicht in einer 64-Bit-Variablen speichern können, dann tun Sie etwas in der Art von.

%Vor%

Nun können Sie sowohl tsLow als auch tsHigh in Ihren externen Daten speichern. Sie könnten auch spezielle Funktionen implementieren, die Werte mithilfe der zwei separaten 32-Bit-Zahlen berechnen können, um Ihre eigene 64-Bit-Mathematik zu erstellen.

Das hängt wirklich von Ihren tatsächlichen Einschränkungen ab. Diese zu kennen, wird helfen, bessere Lösungen vorzuschlagen.

    
galford13x 23.04.2010 01:06
quelle

Tags und Links