419 Stimmen

Wie man Millisekunden von einem .NET DateTime abschneidet

Ich versuche, einen Zeitstempel aus einer eingehenden Anfrage mit einem in der Datenbank gespeicherten Wert zu vergleichen. SQL Server hält natürlich einige Genauigkeit von Millisekunden auf die Zeit, und wenn in eine .NET DateTime gelesen, es enthält diese Millisekunden. Die eingehende Anforderung an das System bietet jedoch nicht diese Präzision, so dass ich einfach die Millisekunden weglassen muss.

Ich habe das Gefühl, dass ich etwas Offensichtliches übersehe, aber ich habe keinen eleganten Weg gefunden, es zu tun (C#).

11voto

Bob Punkte 93584

Anstatt die Millisekunden zu streichen und dann zu vergleichen, warum nicht die Differenz vergleichen?

DateTime x; DateTime y;
bool areEqual = (x-y).TotalSeconds == 0;

ou

TimeSpan precision = TimeSpan.FromSeconds(1);
bool areEqual = (x-y).Duration() < precision;

10voto

Colonel Panic Punkte 125419

Auf die Sekunde genau abrunden:

dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond)

Ersetzen durch TicksPerMinute um auf die Minute abzurunden.


Wenn Ihr Code leistungsempfindlich ist, sollten Sie vorsichtig sein mit

new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second)

Meine Anwendung verbrachte 12% der CPU-Zeit in System.DateTime.GetDatePart .

9voto

Diadistis Punkte 11787

Weniger offensichtlich, aber mehr als 2-mal schneller:

// 10000000 runs

DateTime d = DateTime.Now;

// 484,375ms
d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);

// 1296,875ms
d = d.AddMilliseconds(-d.Millisecond);

7voto

AlliterativeAlice Punkte 10803

Nicht die schnellste Lösung, aber einfach und leicht verständlich:

DateTime d = DateTime.Now;
d = d.Date.AddHours(d.Hour).AddMinutes(d.Minute).AddSeconds(d.Second)

4voto

Sergio Cabral Punkte 5472

Ein Weg zum einfachen Lesen ist...

//Remove milliseconds
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss", null);

Und mehr...

//Remove seconds
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm"), "yyyy-MM-dd HH:mm", null);

//Remove minutes
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH"), "yyyy-MM-dd HH", null);

//and go on...

Ich verstehe, dass sie leicht zu verstehen ist, aber es fehlt ihr an Leistung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X