Come verificare se un DateTime si verifica oggi?


110

Esiste un modo migliore .net per verificare se un DateTime si è verificato "oggi" rispetto al codice seguente?

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
Puoi confrontare newStory.Date == DateTime.Now.Date
Guillaume,

Risposte:


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

}
else
{

}

Dovrebbe fare il trucco.


3
... se newsStory.Date è in realtà solo la parte della data, senza tempo. ;)
Lucero

14
... che è, se newsStory è un DateTime
stevemegson

18
beh, DateTime fa parte della libreria di classi .NET Framework, quindi mentre è possibile che l'OP abbia creato la sua classe che ha lo stesso nome, dovresti chiederti perché avrebbe chiesto a StackOverflow come utilizzare una classe personalizzata ha creato e si aspetta che noi sappiamo magicamente come funzionava. ;)
Brian Schroth

2
@ Lucero è possibile, tuttavia il titolo della domanda recita "due DateTimes". ;) Immagino sia da lì che abbiamo preso quel tipo mancante.
pirocumulo

1
@HansPetterNaumann è logico :) DateTime.AddHours () restituisce un nuovo oggetto DateTime, annullando così di fatto l'operazione .Today che in effetti non aveva una componente temporale.
pirocumulo

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

5
Vorrei aggiungere che è un bug molto comune (e difficile da individuare): basta confrontare DateTime con DateTime.Today.
JL.

16

Provare

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

14

La mia soluzione:

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

7

Se NewsStory utilizzava anche un DateTime, basta confrontare la proprietà Date e il gioco è fatto.

Tuttavia, questo dipende da cosa significa effettivamente "oggi". Se qualcosa viene pubblicato poco prima di mezzanotte, sarà "vecchio" dopo poco tempo. Quindi forse sarebbe meglio mantenere la data esatta della storia (inclusa l'ora, preferibilmente UTC) e controllare se sono trascorse meno di 24 ore (o qualsiasi altra cosa), il che è semplice (le date possono essere sottratte, il che ti dà un TimeSpan con un TotalHours o proprietà TotalDays).


5

È possibile implementare un metodo di estensione DateTime.

Crea una nuova classe per i tuoi metodi di estensione:

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;
        }
    }
}

E ora, ovunque nel tuo codice, dove vuoi eseguire questo test, dovresti includere l'utilizzo:

using ExtensionMethods;

Quindi, usa il metodo di estensione:

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
perché non restituire semplicemente datetime1.Date == datetime2.Date?
Sergiu Mindras

@SergiuMindras ha ragione, è sufficiente confrontare entrambi Datepoiché TimeSpansarà sempre 00:00:00.
GoRoS

5

Cordiali saluti,

newsStory.Date == DateTime.Today

restituirà lo stesso risultato di confronto della codifica

newsStory == DateTime.Today

dov'è newsStoryun DateTimeoggetto

.NET è abbastanza intelligente da determinare che si desidera confrontare solo in base alla data e lo utilizza per il confronto interno. Non sono sicuro del perché e in realtà ho problemi a trovare la documentazione per questo comportamento.




1

beh, DateTime ha una proprietà "Date" e potresti semplicemente confrontare in base a quella. Ma guardando i documenti sembra che ottenere quella proprietà in realtà installi un nuovo datetime con il componente time impostato a mezzanotte, quindi potrebbe essere molto più lento rispetto all'accesso a ogni singolo componente, sebbene molto più pulito e più leggibile.


Penso che un rallentamento (se esiste) sarà così piccolo che non ha importanza in quasi tutti i casi. Certamente un caso di ottimizzazione prematura.
Esben Skov Pedersen

D'accordo: in questi giorni trovo che sia sempre più difficile scuotere l'ottimizzazione prematura poiché il mondo moderno della codifica è più basato sulla leggibilità e sulla manutenibilità. Le vecchie abitudini sono dure a morire!
Peter Bridger,

0

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


-4

Che ne dite di

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

Ma questo tornerà vero anche per il 1 ° gennaio 2008 e il 1 ° gennaio 2009, che può essere o meno quello che vuoi.


-6

potresti usare DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }

1
Non credo che funzionerà. Se oggi è il 21/10/2009 e newsStory è il 21/10/2008, tornerà vero (non ho tenuto conto degli anni bisestili qui).
Philip Wallace,

2
Questo non discriminerà tra i nuovi anni DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave D,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.