2009-10-21 13 views
82

Esiste un modo migliore .net per verificare se un DateTime si è verificato "oggi", quindi il codice seguente?Come verificare se si verifica un DateTime oggi?

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

È possibile confrontare newStory.Date == DateTime.Now.Date – Guillaume

+0

D'oh, certo! :) Grazie –

risposta

169
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

... quale è, se newsStory è un DateTime – stevemegson

+0

@stevemegson +1 :) –

13

Prova

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

@Lucero - grazie per l'ordinamento della formattazione per me :) –

25
if(newsStory.Date == DateTime.Today) 
{ 
    // happened today 
} 
+4

Vorrei aggiungere, è un bug molto comune (e difficile da individuare) - basta confrontare il DateTime con un DateTime.Today. –

2

Come Guillame suggerito in a comment, confrontare i valori di Date proprietà:

newStory.Date == DateTime.Now.Date 
7

Se NewsStory stava usando un DateTime anche, basta confrontare la proprietà data, e il gioco è fatto.

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

+0

+1 per una risposta più completa – JustLoren

-5

si potrebbe usare DateTime.Now.DayOfYear

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

} 
else 
{ // story didn't happen today 

} 
+1

Non penso che funzionerà. Se oggi è il 21/10/2009 e newsStory è il 21/10/2008, restituirà true (non ho tenuto conto degli anni bisestili qui). –

+2

Ciò non discrimina tra anni new DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear; –

+0

Sei corretto. Mi è totalmente mancato. –

2

Prova questa:

newsStory.Date == DateTime.Today 
-3

Come su

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

ma questo sarà anche restituire vero per il 1 ° gennaio 2008 e il 1 gennaio 2009, che può o non può essere quello che vuoi.

1

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

+0

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

+0

D'accordo - in questi giorni trovo sempre più difficile scuotere l'ottimizzazione prematura perché il mondo della programmazione moderna è più incentrato sulla leggibilità e sulla manutenibilità. Le vecchie abitudini sono dure a morire! –

4

FYI,

newsStory.Date == DateTime.Today

restituirà lo stesso risultato di codifica confrontare

newsStory == DateTime.Today

dove newsStory è un oggetto DateTime

.NET è abbastanza intelligente per determinare voi vuoi confrontare in base a Date only e usa th per il confronto interno. Non sono sicuro del motivo e in realtà non riescono a trovare la documentazione per questo comportamento.

+0

Punto interessante, grazie –

11

La mia soluzione:

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

è possibile implementare un metodo di estensione DateTime.

Crea nuova classe per i vostri 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; 
     } 
    } 
} 

Ed ora, ovunque sul vostro codice, dove vuoi eseguire questo test, si dovrebbe includere l'utilizzo:

using ExtensionMethods; 

E quindi, utilizzare il metodo di estensione:

newsStory.WhenAdded.IsSameDay(DateTime.Now); 
+3

perché non solo restituire datetime1.Date == datetime2.Date? –

+0

@SergiuMindras ha ragione, è sufficiente confrontare entrambi i 'Date' dal momento che è' TimeSpan' sarà sempre 00:00:00. – GoRoS

Problemi correlati