C# Zeiten Vergleichen?
Hallo,
Angenommen ich habe ein Datum: 20.02.2020.
Wie kann ich nun abfragen ob 7 Tage Vergangen sind ?
mein erster Gedanke: Beide variablen miteinander Vergleichen und mittels < > Vergleich aber geht das so ?
6 Antworten
Gutes Link von Spoiler, doch Hardcore.
Grundsätzlich: Jedes Datum wird gespeichert als eine "double" (je nach Programmiersprache verschieden bezeichnet) Zahl:
Vor dem Komma steht der Tag als Zahl und nach dem Komma die Zeit.
Also z.b. 45667,455
Der Tag wäre der 45667 (jeden Tag hochgezählt glaublich seit 1.1.1900) und 0,455 die Uhrzeit.
Diese Zahl muss man konvertieren, um das Datum zu sehen. Doch man kann mit ihr prima rechnen. 2 Tage vor 45667 sind 45665.
Achtung! Wenn Du 2 Tage vergleichst, einer hat die Zeit dabei und einer nicht, - dann wäre das Datum natürlich "ungleich".
mit Timespan muss man sich nichtmal mehr herumrechnen. Je nach abgefragter Einheit bekommt man sogar die vergangenen/erwarteten Tiks geliefert.
Theoretisch muss man nicht einmal Pollen , man könnte auch einen Event setzten:
https://docs.microsoft.com/de-de/dotnet/api/system.timers.timer.elapsed?view=netcore-3.1
1000 Wege führen nach Rom...
Natürlich nimmt man die. Doch den Hintergrund zu verstehen, hat noch niemanden geschadet. Gerade meine letzte Zeile zu "ungleich" ist Wissen, dass manches erhellt, das "vorher nicht ging".
Naja, dass ein DateTime einen Zeitstempel enthält, ist ja irgendwie auch klar ;-)
So klar ist das durchaus nicht. Die Feinheiten der Typen mit und ohne Zeit kannst Du auf StackOverflow nachlesen. Suche also bitte dort, sollte es Dich interessieren.
Doch, schon. Sonst würde der Datentyp Date heißen und nicht DateTime.
sorry ich war bei meiner ersten Antwort auf den nackten Vergleich aus...
Aber auch Dein Problem ist trivial.
die Timespan-Struktur hat für fast alle Gegebenheiten eine Lösung:
- https://docs.microsoft.com/de-de/dotnet/api/system.timespan?view=netcore-3.1#constructors
- https://docs.microsoft.com/de-de/dotnet/api/system.timespan.days?view=netcore-3.1#System_TimeSpan_Days
- https://www.dotnetperls.com/timespan
int DaysBetween(DateTime d1, DateTime d2) {
TimeSpan span = d2.Subtract(d1);
return (int)span.TotalDays;
}
Nun, das ist sogar sehr einfach:
if (theGivenDate.AddDays(7) <= DateTime.Now) { ... }
Wenn es Dir wirklich nur um den Tag und nicht auf die Sekunde genau ankommt, kannst Du auch sagen:
if (theGivenDate.Date.AddDays(7) <= DateTime.Now.Date)
Dann wird die Uhrzeit "Mitternacht" verwendet.
Du kannst zwei DateTimes mit den üblichen Operatoren vergleichen, ähnlich wie bei Zahlen.
Z.B. kannst Du den aktuellen Zeitpunkt minus den vergangenen Zeitpunkt berechnen und bekommst dann einen TimeSpan-Wert zurück und darüber kannst Du dann abfragen, wie viele Tage, Stunden, Minuten, etc. das sind.
Das funktioniert auch umgekehrt:
DateTime + TimeSpan = etwas späteres DateTime
Für das alles gibt's natürlich auch Methoden und noch speziellere Funktionen.
Schau dir am besten die Doku-Seiten zu DateTime und TimeSpan an.
Völlig unnötig. Ist in C# ein Einzeiler und man muss nichts darüber wissen, ob und wie ein DateTime intern behandelt wird. Man nimmt einfach die Routinen, die in der DateTime-Klasse ohnehin vorhanden sind.