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
}
Peter Bridger
quelle
14
Sie können newStory.Date == DateTime.Now.Date
Guillaume

Antworten:

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

}
else
{

}

Sollte den Trick machen.

Pyrocumulus
quelle
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
}
Dave Downs
quelle
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 */ }
Stephen Newman
quelle
14

Meine Lösung:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}
A. Polezhaev
quelle
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).

Lucero
quelle
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);
Benjamim
quelle
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.

guck
quelle
4

Vergleichen Sie die Werte der Eigenschaften, wie Guillame in einem Kommentar vorgeschlagen hat Date:

newStory.Date == DateTime.Now.Date
Anton Gogolev
quelle
2

Versuche dies:

newsStory.Date == DateTime.Today
Philip Wallace
quelle
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.

Brian Schroth
quelle
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";

Sasan Salem
quelle
-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.

Polyfun
quelle
-6

Du könntest benutzen DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }
Ryan Alford
quelle
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