2009-03-25 5 views
18

Il semble qu'il existe plusieurs manières possibles de déterminer si un System.DateTime donné représente minuit. Quels sont les avantages et les inconvénients de chacun? Est-il plus lisible ou plus performant que les autres?Quelle est la meilleure façon de déterminer si un System.DateTime est minuit?

EDIT: Je crois que la lisibilité est plus importante que la performance jusqu'à ce que le profilage montre qu'il y a un problème. C'est pourquoi j'ai posé des questions sur les deux.

Exemple 1

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

Exemple 2

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

Mes exemples sont en VB.NET puisque c'est ce que J'utilise actuellement professionnellement. Cependant, cette question est applicable à toutes les langues du .NET Framework. –

+0

Pour ceux qui sont curieux de l'utilisation, je vérifie les champs DateTimes saisis par date par rapport à ceux entrés par les champs date et heure. –

Répondre

37

Je vérifierais (en utilisant C# pour l'exemple):

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

OMI, cela est plus facile que d'utiliser FromHours etc, et ne comporte pas de multiplication supplémentaire (depuis Ticksdéfini la TimeSpan - toutes les autres propriétés sont calculées).

+0

Je pense que la mesure des tiques ne serait jamais évaluer à vrai dire. Exécuter quelques déclarations impliquerait quelques ticks.Might être plus facile de vérifier les minutes. – Cerebrus

+4

Il serait évalué à vrai pour tous les temps qui représentent * vrai * minuit. Vous ne l'appelez pas sur "DateTime.Now", évidemment, mais il fait le travail comme indiqué ... –

+1

Plus important encore, il correspond exactement à la "Return value.TimeOfDay = TimeSpan.FromHours (0)" de la question d'origine . Vérification des minutes etc ** ** ** –

5

dépend. Voulez-vous vérifier exactement minuit à la seconde, ou juste que c'est l'heure de minuit?

Pour l'heure de minuit

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

Pour l'heure de minuit et minute

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

Pour purement simplement, exactement minuit, vous pouvez utiliser votre exemple. Cependant, cela inclura des vérifications jusqu'à la milliseconde, ce qui peut ne pas être ce que vous voulez.

+0

Je cherche exactement minuit à la milliseconde. –

+0

@Eric, alors la réponse de Marc est la manière la plus efficace. – JaredPar

7

Ceci est un peu de micro-optimisation, l'une ou l'autre méthode fonctionnerait bien.

Quoi qu'il en soit, je pense que c'est ce qui les meilleures performances:

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

Si vous voulez un code compréhensible, peut-être cela est le mieux:

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

En fait, ceux-ci devraient fonctionner de manière plus ou moins égale, puisque Ticks est utilisé comme une valeur interne dans TimeSpan. Donc (timespan == timespan) est plus ou moins le même que (timespan.ticks == timespan.ticks) qui dans les deux cas sera (timespan.ticks == 0) –

+0

Oui, l'opérateur == est mis en œuvre pour comparer le Ticks propriétés, donc TimeSpan.Zero.Ticks est juste un itinéraire plus long pour arriver à zéro. :) – Guffa

Questions connexes