Comment vérifier si un DateTime se produit aujourd'hui?


110

Existe-t-il un meilleur moyen .net de vérifier si un DateTime s'est produit «aujourd'hui», puis le code ci-dessous?

if ( newsStory.WhenAdded.Day == DateTime.Now.Day &&
     newsStory.WhenAdded.Month == DateTime.Now.Month &&
     newsStory.WhenAdded.Year == DateTime.Now.Year )
{ 
    // Story happened today
}
else
{ 
    // Story didn't happen today
}

14
Vous pouvez comparer newStory.Date == DateTime.Now.Date
Guillaume

Réponses:


222
if (newsStory.WhenAdded.Date == DateTime.Today)
{

}
else
{

}

Devrait faire l'affaire.


3
... si newsStory.Date n'est en fait que la partie date, sans heure. ;)
Lucero

14
... ce que c'est, si newsStory est un DateTime
stevemegson

18
Eh bien, DateTime fait partie de la bibliothèque de classes .NET Framework, donc s'il est possible que l'OP ait créé sa propre classe qui partage le même nom, vous devriez vous demander pourquoi il demanderait à StackOverflow comment utiliser une classe personnalisée il a créé et attend de nous que nous sachions comme par magie comment cela fonctionnait. ;)
Brian Schroth

2
@Lucero, c'est possible, mais le titre de la question se lit comme suit: «deux DateTimes». ;) Je suppose que c'est de là que nous avons obtenu ce type manquant.
pyrocumulus

1
@HansPetterNaumann c'est logique :) DateTime.AddHours () retourne un nouvel objet DateTime, annulant ainsi efficacement votre opération .Today qui n'avait en effet pas de composante temporelle.
pyrocumulus

29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}

5
Je voudrais ajouter, c'est un bug très courant (et difficile à repérer) - il suffit de comparer le DateTime à un DateTime.Today.
JL.

16

Essayer

if (newsStory.Date == DateTime.Now.Date) 
{ /* Story happened today */ }
else
{ /* Story didn't happen today */ }

14

Ma solution:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}

7

Si NewsStory utilisait également un DateTime, comparez simplement la propriété Date et vous avez terminé.

Cependant, cela dépend de ce que signifie réellement «aujourd'hui». Si quelque chose est posté peu de temps avant minuit, il sera "ancien" après une courte période. Alors peut-être qu'il serait préférable de conserver la date exacte de l'histoire (y compris l'heure, de préférence UTC) et de vérifier si moins de 24 heures (ou autre) se sont écoulées, ce qui est simple (les dates peuvent être soustraites, ce qui vous donne un TimeSpan avec un TotalHours ou propriété TotalDays).


5

Vous pouvez implémenter une méthode d'extension DateTime.

Créez une nouvelle classe pour vos méthodes d'extension:

namespace ExtensionMethods
{
    public static class ExtensionMethods
    {
        public static bool IsSameDay( this DateTime datetime1, DateTime datetime2 )
        {
            return datetime1.Year == datetime2.Year 
                && datetime1.Month == datetime2.Month 
                && datetime1.Day == datetime2.Day;
        }
    }
}

Et maintenant, partout dans votre code, où voulez-vous effectuer ce test, vous devez inclure l'utilisation:

using ExtensionMethods;

Et puis, utilisez la méthode d'extension:

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
pourquoi ne pas simplement renvoyer datetime1.Date == datetime2.Date?
Sergiu Mindras

@SergiuMindras a raison, il suffit de comparer les deux Datecar il TimeSpansera toujours 00:00:00.
GoRoS

5

FYI,

newsStory.Date == DateTime.Today

renverra le même résultat de comparaison que le codage

newsStory == DateTime.Today

newsStoryest un DateTimeobjet

.NET est suffisamment intelligent pour déterminer que vous souhaitez comparer en fonction de la date uniquement et l'utilise pour la comparaison interne. Je ne sais pas pourquoi et j'ai du mal à trouver de la documentation sur ce comportement.




1

Eh bien, DateTime a une propriété "Date" et vous pouvez simplement comparer en fonction de cela. Mais en regardant la documentation, il semble que l'obtention de cette propriété instancie en fait une nouvelle date / heure avec le composant d'heure réglé sur minuit, donc cela peut très bien être plus lent que d'accéder à chaque composant individuel, bien que beaucoup plus propre et plus lisible.


Je pense qu'un ralentissement (s'il existe) sera si petit qu'il n'a pas d'importance dans presque tous les cas. Certainement un cas d'optimisation prématurée.
Esben Skov Pedersen

D'accord - ces jours-ci, je trouve qu'il est de plus en plus difficile de se débarrasser de l'optimisation prématurée car le monde du codage moderne est davantage axé sur la lisibilité et la maintenabilité. Les vieilles habitudes ont la vie dure!
Peter Bridger

0

if (newsStory.ToShortDateString() == DateTime.Today.ToShortDateString()) return "Todtay";


-4

Que diriez-vous

if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
{ // Story happened today
}

Mais cela reviendra également vrai pour le 1er janvier 2008 et le 1er janvier 2009, ce qui peut être ou non ce que vous voulez.


-6

tu pourrais utiliser DateTime.Now.DayOfYear

 if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
 { // story happened today

 }
 else
 { // story didn't happen today

 }

1
Je ne pense pas que cela fonctionnera. Si aujourd'hui est 21/10/2009, et newsStory est 21/10/2008 - cela reviendra vrai (je n'ai pas pris en compte les années bissextiles ici).
Philip Wallace

2
Cela ne fera pas de distinction entre les années new DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave D
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.