Ich versuche, einen Zeitstempel von einer eingehenden Anforderung mit einem in der Datenbank gespeicherten Wert zu vergleichen. SQL Server behält natürlich eine gewisse Genauigkeit von Millisekunden bei, und wenn es in eine .NET DateTime eingelesen wird, enthält es diese Millisekunden. Die eingehende Anforderung an das System bietet jedoch nicht diese Genauigkeit, sodass ich einfach die Millisekunden löschen muss.
Ich habe das Gefühl, dass mir etwas Offensichtliches fehlt, aber ich habe keinen eleganten Weg gefunden, dies zu tun (C #).
string
Darstellung von a weggelassen oder entfernt wirdDateTime
, ist möglicherweise eine Bearbeitung erforderlich, um zu verdeutlichen, dass "abgeschnitten" werden muss. / „Drop“ Millisekunden bedeuten „erzeugt einenDateTime
Wert , bei dem alle Datum / Zeit - Komponenten gleich sind , außerTimeOfDay.TotalMilliseconds
ist0
.“ Die Leute lesen natürlich nicht, sondern nur, um Unklarheiten zu beseitigen.Antworten:
Das Folgende funktioniert für eine DateTime mit Millisekundenbruchteilen und behält auch die Kind-Eigenschaft (Local, Utc oder Undefined) bei.
oder das Äquivalent und kürzer:
Dies könnte in eine Erweiterungsmethode verallgemeinert werden:
welches wie folgt verwendet wird:
quelle
quelle
Hier ist eine Erweiterungsmethode, die auf einer vorherigen Antwort basiert und es Ihnen ermöglicht, auf eine beliebige Auflösung zu kürzen ...
Verwendungszweck:
Klasse:
quelle
quelle
Millisecond
Eigenschaft gibt eine Ganzzahl zwischen 0 und 999 (einschließlich) an. Wenn also beispielsweise die Tageszeit vor der Operation war,23:48:49.1234567
dann ist diese Ganzzahl123
und die Tageszeit nach der Operation23:48:49.0004567
. Es wurde also nicht auf eine ganze Anzahl von Sekunden gekürzt.Manchmal möchten Sie auf etwas Kalenderbasiertes wie Jahr oder Monat kürzen. Hier ist eine Erweiterungsmethode, mit der Sie eine beliebige Auflösung auswählen können.
quelle
Warum nicht den Unterschied vergleichen, anstatt die Millisekunden fallen zu lassen und dann zu vergleichen?
oder
quelle
Weniger offensichtlich, aber mehr als zweimal schneller:
quelle
d.AddMilliseconds(-d.Millisecond)
die DateTime nicht unbedingt genau auf die vorherige volle Sekunde verschiebt.d.Ticks % TimeSpan.TicksPerMillisecond
Ticks (irgendwo zwischen 0 und 9.999) jenseits Ihrer Sekunde bleiben erhalten.Um auf die Sekunde abzurunden:
Ersetzen Sie durch
TicksPerMinute
, um auf die Minute abzurunden.Wenn Ihr Code leistungsabhängig ist, seien Sie vorsichtig
Meine App verbrachte 12% der CPU-Zeit in System.DateTime.GetDatePart .
quelle
Ein Weg zum einfachen Lesen ist ...
Und mehr...
quelle
var now = DateTime.Parse(DateTime.Now.ToString())
einwandfrei funktioniert.In Bezug auf Diadistis Antwort. Dies funktionierte für mich, außer dass ich Floor verwenden musste, um den Bruchteil der Division vor der Multiplikation zu entfernen. Damit,
wird
Ich hätte erwartet, dass die Division von zwei Long-Werten zu einem Long führt, wodurch der Dezimalteil entfernt wird, aber es wird als Double aufgelöst, wobei nach der Multiplikation genau derselbe Wert erhalten bleibt.
Eppsy
quelle
2 Erweiterungsmethoden für die oben genannten Lösungen
Verwendungszweck:
quelle
Nicht die schnellste Lösung, aber einfach und leicht zu verstehen:
quelle
Und durch Verwendung von
: P.
quelle
string
statt a erzeugt werden sollDateTime
, aber dies lässt Zeitkomponenten vollständig aus der Ausgabe aus . (Das macht auch den Zugriff auf dieToday
Immobilie unnötig.)Neue Methode
// String-Pass-Parameter definieren TT-MMM-JJJJ Rückgabe 24.02.2016
Oder im Textfeld angezeigt
// PageonLoad aufsetzen
quelle
string
statt a erzeugt werden sollDateTime
, aber dies lässt Zeitkomponenten vollständig aus der Ausgabe aus . (Das macht auch den Zugriff auf dieToday
Immobilie unnötig.)In meinem Fall wollte ich TimeSpan aus dem datetimePicker-Tool speichern, ohne die Sekunden und Millisekunden zu speichern. Hier ist die Lösung.
Konvertieren Sie zuerst den datetimePicker.value in das gewünschte Format. Meines ist "HH: mm" und konvertieren Sie ihn dann zurück in TimeSpan.
quelle
string
) wäre dies.DateTime datetime = datetimepicker1.Value; TimeSpan timeSpan = new TimeSpan(datetime.Hour, datetime.Minute, 0);
Oder Sie könnten eine Variation von Joes Erweiterungsmethode verwenden , die mitTimeSpan
Werten arbeitet undTimeSpan timeSpan = datetime.TimeOfDay.Truncate(TimeSpan.FromSeconds(1));
zum Abschneiden von Sekunden verwendet wird.Dies ist meine Version der hier und in ähnlichen Fragen veröffentlichten Erweiterungsmethoden. Dadurch wird der Ticks-Wert auf leicht lesbare Weise überprüft und das DateTimeKind der ursprünglichen DateTime-Instanz beibehalten. (Dies hat subtile, aber relevante Nebenwirkungen beim Speichern in einer Datenbank wie MongoDB.)
Wenn das eigentliche Ziel darin besteht, eine DateTime auf einen bestimmten Wert (dh Stunden / Minuten / Sekunden / MS) zu kürzen, empfehle ich, diese Erweiterungsmethode stattdessen in Ihrem Code zu implementieren. Es stellt sicher, dass Sie nur mit einer gültigen Genauigkeit abschneiden können, und behält die wichtigen DateTimeKind-Metadaten Ihrer ursprünglichen Instanz bei:
Dann können Sie die Methode wie folgt verwenden:
quelle
Ich weiß, dass die Antwort ziemlich spät ist, aber der beste Weg, Millisekunden loszuwerden, ist
Versuchen Sie, den Wert der Variablen zu drucken. Es wird die Datums- und Uhrzeit ohne Millisekunden angezeigt.
quelle