2009-03-25 17 views
18

Es scheint, dass es mehrere Möglichkeiten gibt zu bestimmen, ob eine bestimmte System.DateTime für Mitternacht steht. Was sind die Vor- und Nachteile von jedem? Ist einer mehr lesbar oder besser als die anderen?Was ist der beste Weg zu bestimmen, ob eine System.DateTime Mitternacht ist?

EDIT: Ich glaube, dass Lesbarkeit ist wichtiger als Leistung, bis Profiling zeigt, dass es ein Problem gibt. Deshalb habe ich nach beiden gefragt.

Beispiel 1

Public Function IsMidnight(ByVal value As Date) As Boolean 
    Return value.TimeOfDay = TimeSpan.FromHours(0) 
End Function 

Beispiel 2

Public Function IsMidnight(ByVal value As Date) As Boolean 
    Return value.CompareTo(value.[Date]) = 0 
End Function 
+0

Meine Beispiele in VB.NET sind denn das ist, was Ich benutze derzeit professionell. Diese Frage gilt jedoch für alle Sprachen in dem .NET. –

+0

Für diejenigen, die neugierig auf die Verwendung sind, suche ich nach DateTimes, die durch Datumsfelder eingegeben werden, im Vergleich zu denen, die durch Datumszeitfelder eingegeben werden. –

Antwort

37

Ich würde überprüfen (C# für das Beispiel verwendet wird):

bool isMidnight = value.TimeOfDay.Ticks == 0; 

IMO, ist dies einfacher als FromHours usw. verwendet wird, und beinhaltet keine zusätzliche Multiplikation (seit Ticks die TimeSpan definiert - alle anderen Eigenschaften werden berechnet).

+0

Ich würde denken, dass die Zeckenmessung kaum jemals als wahr bewertet würde. Die Ausführung einiger Anweisungen würde ein paar Ticks beinhalten. Es könnte einfacher sein, nach Minuten zu suchen. – Cerebrus

+4

Es würde für alle Zeiten, die * wahr * Mitternacht darstellen, als wahr ausgewertet. Sie würden es natürlich nicht 'DateTime.Now' nennen, aber es erledigt den Job wie gesagt ... –

+1

Noch wichtiger, es stimmt genau mit dem" Return value.TimeOfDay = TimeSpan.FromHours (0) "von der ursprünglichen Frage überein . Überprüfung für Minuten usw. ** nicht ** –

5

abhängig. Willst du genau nach Mitternacht nach der Sekunde suchen oder nur, dass es die Mitternachtsstunde ist?

Für die Mitternachtsstunde

Public Function IsMidnightHour(ByVal date as Date) As Boolean 
    return date.Hour = 0 
End Function 

Für Mitternacht Stunde und Minute

Public Function IsMidnightHourAndMinute(ByVal date as Date) As Boolean 
    return date.Hour = 0 AndAlso date.Minute = 0 
End Function 

Für rein einfach, genau Mitternacht können Sie Ihr Beispiel. Dies schließt jedoch auch Prüfungen bis zur Millisekunde ein, die möglicherweise nicht Ihren Vorstellungen entsprechen.

+0

Ich suche genau Mitternacht bis zur Millisekunde. –

+0

@Eric, dann Marc Antwort ist der effizienteste Weg. – JaredPar

7

Dies ist ein bisschen Mikro-Optimierung, beide Methoden würden gut funktionieren.

Wie auch immer, ich denke, das ist es, was wäre die beste Leistung:

Public Function IsMidnight(ByVal value As Date) As Boolean 
    Return value.TimeOfDay.Ticks = 0 
End Function 

Wenn Sie verständlich Code wollen, vielleicht ist dies am besten:

Public Function IsMidnight(ByVal value As Date) As Boolean 
    Return value.TimeOfDay = TimeSpan.Zero 
End Function 
+0

Eigentlich sollten diese mehr oder weniger gleichmäßig funktionieren, da Ticks als interner Wert in TimeSpan verwendet wird. Also (Zeitspanne == Zeitspanne) ist mehr oder weniger dasselbe wie (Zeitspannen.Ticks == Zeitspannen.Ticks) die in beiden Fällen sein werden (Zeitspannen.Ticks == 0) –

+0

Ja, der == Operator ist implementiert, um die zu vergleichen Ticks Eigenschaften, also TimeSpan.Zero.Ticks ist nur eine längere Route, um auf Null zu kommen. :) – Guffa

Verwandte Themen