DateTime.Now gerundet auf Millisekunden

CopWorker

Erfahrenes Mitglied
Hallo,
ist es möglich, das die Ticks auf ganze Millisekunden gerundet werden.
D.h. 49837.909084399995 soll auf den Wert 49837.909000000000 gerundet erzeugt werden bei:
DateTime dtNow = DateTime.Now;

Kann ich das irgendwie beeinflussen?

Vielen Dank.
Gruß von CopWorker
 
Hallo,
ist es möglich, das die Ticks auf ganze Millisekunden gerundet werden.
D.h. 49837.909084399995 soll auf den Wert 49837.909000000000 gerundet erzeugt werden bei:
DateTime dtNow = DateTime.Now;

Kann ich das irgendwie beeinflussen?

Vielen Dank.
Gruß von CopWorker
Wieso denkst du dass .... .909 die Millisekunden sind?

Ein Tick ist ein Tick.
Auf Millisekunden runden macht man bei der "Darstellung" eines Zeitwerts, nicht auf den "Urwert"
 
Wieso denkst du dass .... .909 die Millisekunden sind?
Weil das so in der Auflösung beim Debugger ersichtlich ist.
Da wird aufgelöst nach Monat, Tab, Stunde, Minute, Sekunde, Millisekunde.

Folgendes:
Ich schreibe ganze Strukturen die mit einem Zeitstempel versehen sind in eine Datenbanktabelle.
Der Variablentyp der Datenbanktabelle ist eben "timestamp".
Diese Tabellenspalte kann nur ganze Millisekunden.
Lese ich nun die Inhalte der Datenbanktabelle aus und vergleiche
die Objekte mit denen die ich noch temp. in einer Liste mitführe,
dann gibt es keine Übereinstimmung.
Denn die Objekte in meiner temp. Liste haben einen Zeitstempel mit 909,084399995 Millisekunden und die Objekte die ich aus der Datenbanktabelle lese haben eine Zeitstempel mit 909.00000000 Millisekunden.

Bin für jede Hilfe dankbar.
Grüße von CopWorker
 
Denn die Objekte in meiner temp. Liste haben einen Zeitstempel mit 909,084399995 Millisekunden und die Objekte die ich aus der Datenbanktabelle lese haben eine Zeitstempel mit 909.00000000 Millisekunden.
Ohje. Grundsätzlich sollte man nie Gleitkommawerte vergleichen, weil es einfach viel zu viele Möglichkeiten gibt wie das nach hinten losgehen kann.
Wenn du möchtest, dass die Zeitstempel zuverlässig vergleichbar sind, musst du mit Ganzzahlen rechnen. Ist ja kein Problem, wie du bereits geschrieben hast sind die Einträge in der Datenbank eh schon Millisekunden-Werte. Du kannst die Gleitkommawerte ja einfach durch Multiplikation mit 1000 und anschließende Umwandlung zu Integern in Millisekunden-Werte verwandeln:
assert_eqal(int(49837.909084399995 * 1000), 49837909);

Aber:
Bist du dir sicher, dass du die Zeitstempel zum Vergleich heranziehen willst? Für mich klingt das nämlich so, als dienten dir die Zeitstempel hier als Index für die einzelnen Einträge. Den Werten nach bewegen wir uns hier aber in einem 24h-Rahmen, die Zeitstempel liegen somit also im Bereich von 0 bis 86'400'000. Je nach Anwendungsfall kann es da also durchaus schon zu Kollisionen kommen, wenn mehrere Einträge in der gleichen Millisekunde passiert sind (Stichwort Geburtstagsparadoxon). Dann müsstest du später große Teile deiner Programmlogik umschreiben.
Besser wäre es womöglich schon von Anfang an eine separate Eigenschaft "Index" zu deiner Struktur hinzuzufügen, der beim Anlegen eines Eintrags automatisch diesem hinzugefügt und um 1 erhöht wird. Dadurch wären alle Einträge einzigartig, und der Index würde dir einen sicheren Weg für den Vergleich oder das Sortieren von Einträgen geben.

Gruß Technipion
 

Neue Beiträge

Zurück