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
}

14
Możesz porównać newStory.Date == DateTime.Now.Date
Guillaume

Odpowiedzi:


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

}
else
{

}

Powinien załatwić sprawę.


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
}

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 */ }

14

Moje rozwiązanie:

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

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).


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

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.




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.


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


-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.


-6

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

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

 }
 else
 { // story didn't happen today

 }

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.