Jak sprawdzić, czy DateTime występuje dzisiaj?

110

Czy istnieje lepszy sposób .net na sprawdzenie, czy DateTime wystąpił „dzisiaj” niż poniższy kod?

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
źródło
14
Możesz porównać newStory.Date == DateTime.Now.Date
Guillaume

Odpowiedzi:

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

}
else
{

}

Powinien załatwić sprawę.

pyrocumulus
źródło
3
... jeśli newsStory.Date jest w rzeczywistości tylko częścią daty, bez czasu. ;)
Lucero
14
... co to jest, jeśli newsStory jest DateTime
stevemegson
18
cóż, DateTime jest częścią biblioteki klas .NET Framework, więc chociaż możliwe jest, że OP stworzył własną klasę, która ma tę samą nazwę, trzeba się zastanawiać, dlaczego zapytał StackOverflow, jak używać niestandardowej klasy stworzył i oczekuje, że magicznie wiemy, jak to działa. ;)
Brian Schroth
2
@Lucero jest to możliwe, ale tytuł pytania brzmi „dwa daty i godziny”. ;) Myślę, że to stąd mamy ten brakujący typ.
pyrocumulus
1
@HansPetterNaumann to logiczne :) DateTime.AddHours () zwraca nowy obiekt DateTime, skutecznie anulując w ten sposób operację .Today, która rzeczywiście nie miała składnika czasu.
pyrocumulus
29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}
Dave D.
źródło
5
Chciałbym dodać, że jest to bardzo powszechny (i trudny do wykrycia błąd) - wystarczy porównać DateTime z DateTime.Today.
JL.
16

Próbować

if (newsStory.Date == DateTime.Now.Date) 
{ /* Story happened today */ }
else
{ /* Story didn't happen today */ }
Stephen Newman
źródło
14

Moje rozwiązanie:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}
A.Polezhaev
źródło
7

Jeśli NewsStory również używał DateTime, po prostu porównaj właściwość Date i gotowe.

Zależy to jednak od tego, co właściwie oznacza „dzisiaj”. Jeśli coś zostanie opublikowane krótko przed północą, po krótkim czasie stanie się „stare”. Więc może najlepiej byłoby zachować dokładną datę historii (w tym godzinę, najlepiej UTC) i sprawdzić, czy minęło mniej niż 24 godziny (lub cokolwiek innego), co jest proste (daty można odjąć, co daje TimeSpan z TotalHours lub TotalDays).

Lucero
źródło
5

Można zaimplementować metodę rozszerzenia DateTime.

Utwórz nową klasę dla metod rozszerzających:

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

A teraz wszędzie w kodzie, gdzie chcesz wykonać ten test, powinieneś dołączyć using:

using ExtensionMethods;

Następnie użyj metody rozszerzenia:

newsStory.WhenAdded.IsSameDay(DateTime.Now);
Benjamim
źródło
3
dlaczego po prostu nie zwrócić datetime1.Date == datetime2.Date?
Sergiu Mindras
@SergiuMindras ma rację, wystarczy porównać oba Date, ponieważ TimeSpanzawsze będzie to 00:00:00.
GoRoS
5

FYI,

newsStory.Date == DateTime.Today

zwróci ten sam wynik porównania co kodowanie

newsStory == DateTime.Today

gdzie newsStoryjest DateTimeprzedmiot

Platforma .NET jest wystarczająco inteligentna, aby określić, czy chcesz porównać, tylko na podstawie daty i używa jej do wewnętrznego porównania. Nie wiem dlaczego i mam problem ze znalezieniem dokumentacji opisującej to zachowanie.

guck
źródło
4

Jak zasugerował Guillame w komentarzu , porównaj wartości Datewłaściwości:

newStory.Date == DateTime.Now.Date
Anton Gogolev
źródło
2

Spróbuj tego:

newsStory.Date == DateTime.Today
Philip Wallace
źródło
1

cóż, DateTime ma właściwość „Date” i na tej podstawie możesz po prostu porównać. Ale patrząc na dokumenty, wydaje się, że pobranie tej właściwości w rzeczywistości tworzy instancję nowej daty i godziny z komponentem czasu ustawionym na północ, więc może to być znacznie wolniejsze niż dostęp do każdego pojedynczego komponentu, chociaż znacznie czystsze i bardziej czytelne.

Brian Schroth
źródło
Myślę, że spowolnienie (jeśli istnieje) będzie tak małe, że nie ma znaczenia w prawie wszystkich przypadkach. Z pewnością przypadek przedwczesnej optymalizacji.
Esben Skov Pedersen
Zgoda - obecnie coraz trudniej jest mi pozbyć się przedwczesnej optymalizacji, ponieważ we współczesnym świecie kodowania chodzi bardziej o czytelność i łatwość konserwacji. Stare zwyczaje umierają ciężko!
Peter Bridger
0

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

Sasan Salem
źródło
-4

Co powiesz na

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

Ale to również powróci dla 1 stycznia 2008 i 1 stycznia 2009, co może być tym, czego chcesz, ale nie musi.

Polyfun
źródło
-6

mógłbyś użyć DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }
Ryan Alford
źródło
1
Myślę, że to nie zadziała. Jeśli dzisiaj jest 21.10.2009, a newsStory to 21.10.2008 - to zwróci prawdę (nie brałem tu pod uwagę lat przestępnych).
Philip Wallace
2
Nie spowoduje to rozróżnienia między latami new DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave D