Wie überprüfe ich, ob heute eine DateTime auftritt?


110

Gibt es eine bessere .net-Methode, um zu überprüfen, ob "DateTime" "heute" aufgetreten ist, als den folgenden Code?

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
Sie können newStory.Date == DateTime.Now.Date
Guillaume

Antworten:


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

}
else
{

}

Sollte den Trick machen.


3
... wenn newsStory.Date eigentlich nur der Datumsteil ist, ohne Zeit. ;)
Lucero

14
... was es ist, wenn newsStory eine DateTime ist
stevemegson

18
Nun, DateTime ist Teil der .NET Framework-Klassenbibliothek. Obwohl das OP möglicherweise eine eigene Klasse mit demselben Namen erstellt hat, müssen Sie sich fragen, warum er StackOverflow nach der Verwendung einer benutzerdefinierten Klasse fragen würde Er hat geschaffen und erwartet, dass wir auf magische Weise wissen, wie es funktioniert. ;)
Brian Schroth

2
@Lucero das ist möglich, aber der Fragentitel lautet 'zwei DateTimes'. ;) Ich denke, dort haben wir den fehlenden Typ her.
Pyrocumulus

1
@HansPetterNaumann, das ist logisch :) DateTime.AddHours () gibt ein neues DateTime-Objekt zurück und bricht so effektiv Ihre .Today-Operation ab, die tatsächlich keine Zeitkomponente hatte.
Pyrocumulus

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

5
Ich möchte hinzufügen, dass es ein sehr häufiger (und schwer zu erkennender Fehler) ist - nur die DateTime mit einer DateTime.Today zu vergleichen.
JL.

16

Versuchen

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

14

Meine Lösung:

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

7

Wenn NewsStory auch eine DateTime verwendet hat, vergleichen Sie einfach die Date-Eigenschaft, und fertig.

Dies hängt jedoch davon ab, was "heute" tatsächlich bedeutet. Wenn etwas kurz vor Mitternacht veröffentlicht wird, ist es nach kurzer Zeit "alt". Vielleicht ist es am besten, das genaue Datum der Story (einschließlich der Uhrzeit, vorzugsweise UTC) beizubehalten und zu überprüfen, ob weniger als 24 Stunden (oder was auch immer) vergangen sind. Dies ist einfach (Daten können abgezogen werden, wodurch Sie eine Zeitspanne mit Gesamtstunden erhalten oder TotalDays-Eigenschaft).


5

Sie können eine DateTime-Erweiterungsmethode implementieren.

Erstellen Sie eine neue Klasse für Ihre Erweiterungsmethoden:

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

Und jetzt, überall in Ihrem Code, wo Sie diesen Test durchführen möchten, sollten Sie Folgendes verwenden:

using ExtensionMethods;

Verwenden Sie dann die Erweiterungsmethode:

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
Warum nicht einfach datetime1.Date == datetime2.Date zurückgeben?
Sergiu Mindras

@SergiuMindras ist richtig, es reicht aus, beide zu vergleichen Date, da es TimeSpanimmer 00:00:00 sein wird.
GoRoS

5

Zu Ihrer Information,

newsStory.Date == DateTime.Today

gibt das gleiche Vergleichsergebnis wie die Codierung zurück

newsStory == DateTime.Today

Wo newsStoryist ein DateTimeObjekt?

.NET ist intelligent genug, um zu bestimmen, dass Sie nur anhand des Datums vergleichen möchten, und verwendet dieses für den internen Vergleich. Ich weiß nicht warum und habe tatsächlich Probleme, Dokumentation für dieses Verhalten zu finden.




1

Nun, DateTime hat eine "Date" -Eigenschaft und Sie können sie einfach anhand dieser vergleichen. Wenn Sie sich jedoch die Dokumente ansehen, scheint es, dass das Abrufen dieser Eigenschaft tatsächlich eine neue Datums- / Uhrzeitangabe mit der auf Mitternacht eingestellten Zeitkomponente instanziiert. Daher ist sie möglicherweise langsamer als der Zugriff auf jede einzelne Komponente, obwohl sie viel sauberer und lesbarer ist.


Ich denke, eine Verlangsamung (falls vorhanden) wird so gering sein, dass sie in fast allen Fällen keine Rolle spielt. Sicherlich ein Fall vorzeitiger Optimierung.
Esben Skov Pedersen

Einverstanden - heutzutage fällt es mir zunehmend schwer, vorzeitige Optimierungen auszuräumen, da es in der modernen Codierungswelt mehr um Lesbarkeit und Wartbarkeit geht. Alte Gewohnheiten sind schwer abzulegen!
Peter Bridger

0

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


-4

Wie wäre es mit

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

Dies gilt jedoch auch für den 1. Januar 2008 und den 1. Januar 2009, die möglicherweise Ihren Wünschen entsprechen oder nicht.


-6

Du könntest benutzen DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }

1
Ich denke nicht, dass das funktionieren wird. Wenn heute der 21.10.2009 und die newsStory der 21.10.2008 ist, wird dies als wahr zurückgegeben (ich habe hier keine Schaltjahre berücksichtigt).
Philip Wallace

2
Dies unterscheidet nicht zwischen den neuen DateTime-Jahren (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave Downs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.