2009-03-25 16 views
18

Parece que hay varias formas posibles de determinar si un System.DateTime determinado representa la medianoche. ¿Cuáles son los pros y los contras de cada uno? ¿Es uno más legible o funciona mejor que los demás?¿Cuál es la mejor manera de determinar si un System.DateTime es medianoche?

EDIT: Creo que la legibilidad es más importante que el rendimiento hasta que los perfiles muestren que hay un problema. Es por eso que pregunté sobre ambos.

Ejemplo 1

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

Ejemplo 2

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

Mis ejemplos son en VB.NET ya que es lo Actualmente estoy usando profesionalmente. Sin embargo, esta pregunta es aplicable a todos los idiomas en .NET Framework. –

+0

Para los curiosos por el uso, estoy comprobando los campos de fecha y hora ingresados ​​por fecha frente a los campos ingresados ​​por fecha y hora. –

Respuesta

37

Me echa (usando C# para el ejemplo):

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

OMI, esto es más fácil de utilizar FromHours etc, y no implica ningún extra de multiplicación (ya definido Ticks la TimeSpan - todas las demás propiedades se calculan).

+0

Creo que la medición de las garrapatas casi nunca sería verdadera. Ejecutar un par de declaraciones implicaría algunos tics. Puede ser más fácil verificar los minutos. – Cerebrus

+4

Se evaluaría como verdadero todas las veces que representen * verdadero * medianoche. No lo llamaría en 'DateTime.Now', obviamente, pero hace el trabajo como se indica ... –

+1

Más importante aún, coincide exactamente con el" Valor de retorno.TiempoDeDía = TiempoSpan.De Días (0) "de la pregunta original . Comprobando minutos, etc. ** no ** –

5

depende. ¿Desea verificar exactamente la medianoche a la segunda, o simplemente que es la medianoche?

Para la hora de la medianoche

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

para la hora de la medianoche y minutos

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

Por puramente simplemente, exactamente la medianoche puede utilizar su ejemplo. Sin embargo, eso incluirá cheques de hasta milisegundos que pueden no ser los que usted desea.

+0

Estoy buscando exactamente la medianoche al milisegundo. –

+0

@Eric, entonces la respuesta de Marc es la manera más eficiente. – JaredPar

7

Esto es un poco de micro-optimización, cualquiera de los dos métodos funcionaría bien.

De todos modos, creo que esto es lo que se obtienen mejores resultados:

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

Si desea código comprensible, tal vez esto es lo mejor:

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

En realidad, estos deberían funcionar más o menos por igual, ya que Ticks se usa como un valor interno en TimeSpan. Entonces (timespan == timespan) es más o menos lo mismo que (timespan.ticks == timespan.ticks) que en ambos casos será (timespan.ticks == 0) –

+0

Sí, el operador == se implementa para comparar el Marca las propiedades, por lo que TimeSpan.Zero.Ticks es solo una ruta más larga para llegar a cero. :) – Guffa

Cuestiones relacionadas