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
}
Peter Bridger
la source
14
Vous pouvez comparer newStory.Date == DateTime.Now.Date
Guillaume

Réponses:

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

}
else
{

}

Devrait faire l'affaire.

pyrocumulus
la source
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
}
Dave D
la source
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 */ }
Stephen Newman
la source
14

Ma solution:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}
A. Polezhaev
la source
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).

Lucero
la source
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);
Benjamim
la source
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.

putain
la source
4

Comme Guillame l'a suggéré dans un commentaire , comparez les valeurs des Datepropriétés:

newStory.Date == DateTime.Now.Date
Anton Gogolev
la source
2

Essaye ça:

newsStory.Date == DateTime.Today
Philip Wallace
la source
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.

Brian Schroth
la source
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";

Sasan Salem
la source
-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.

Polyfun
la source
-6

tu pourrais utiliser DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }
Ryan Alford
la source
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