2009-03-25 13 views
18

Sembra che esistano diversi modi per determinare se un determinato System.DateTime rappresenta la mezzanotte. Quali sono i pro ed i contro di ognuno? È più leggibile o performante rispetto agli altri?Qual è il modo migliore per determinare se System.DateTime è mezzanotte?

EDIT: Credo che la leggibilità sia più importante delle prestazioni fino a quando la profilazione non indica che c'è un problema. Ecco perché ho chiesto di entrambi.

Esempio 1

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

Esempio 2

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

miei esempi sono in VB.NET dato che questo è ciò che Attualmente sto usando professionalmente. Tuttavia, questa domanda è applicabile a tutte le lingue in .NET Framework. –

+0

Per coloro che sono curiosi sull'utilizzo, sto verificando la presenza di DateTimes immessi per campi di date rispetto a quelli immessi in base ai campi di data e ora. –

risposta

37

mi piacerebbe controllare (utilizzando C# per l'esempio):

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

IMO, questo è più facile che usare FromHours ecc, e non comporta alcuna moltiplicazione extra (dal Ticksdefinito il TimeSpan - tutte le altre proprietà sono calcolate).

+0

Pensavo che la misurazione delle zecche non sarebbe stata quasi mai vera. L'esecuzione di un paio di affermazioni comporterebbe pochi tick. Potrebbe essere più facile da controllare per i minuti. – Cerebrus

+4

Verrà valutato true per tutte le volte che rappresentano * true * mezzanotte. Non lo chiameresti su 'DateTime.Now', ovviamente, ma fa il lavoro come dichiarato ... –

+1

Ancora più importante, corrisponde esattamente al" valore di ritorno.TimeOfDay = TimeSpan.FromHours (0) "dalla domanda originale . Il controllo dei minuti, ecc. ** non ** –

5

Dipende. Vuoi controllare esattamente da mezzanotte al secondo, o solo che è l'ora di mezzanotte?

Per la mezzanotte

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

Per mezzanotte e minuto

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

Per puro semplice, esattamente a mezzanotte è possibile utilizzare il vostro esempio. Tuttavia ciò includerà controlli fino al millisecondo che potrebbero non essere ciò che desideri.

+0

Sto cercando esattamente la mezzanotte al millisecondo. –

+0

@Eric, quindi la risposta di Marc è il modo più efficiente. – JaredPar

7

Questo è un po 'di micro-ottimizzazione, entrambi i metodi funzionerebbero bene.

In ogni caso, credo che questo è quello che si comporta meglio:

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

Se si desidera il codice comprensibile, forse questo è meglio:

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

In realtà, quelli dovrebbero eseguire più o meno allo stesso modo, dal momento che le zecche viene utilizzato come valore interno in TimeSpan. Quindi (timespan == timespan) è più o meno lo stesso di (timespan.ticks == timespan.ticks) che in entrambi i casi sarà (timespan.ticks == 0) –

+0

Sì, l'operatore == è implementato per confrontare il Spunta le proprietà, quindi TimeSpan.Zero.Ticks è solo un percorso più lungo per arrivare a zero. :) – Guffa

Problemi correlati