Feedback

C# - Anzahl von Tagen zwischen zwei Daten ermitteln

Veröffentlicht von am 1/21/2019
(2 Bewertungen)
Wenn man zwei Daten hat, kann man in .NET ganz einfach berechnen, wie viel Tage dazwischen liegen. Das folgende Snippet zeigt ein Beispiel.
Die Ausgabe auf der Console ist dann:

Die Anzahl der Tage ist: 28
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime date1 = new DateTime(2018, 12, 24);
            DateTime date2 = new DateTime(2019, 1, 21);

            double numberOfDays = (date2 - date1).TotalDays;

            Console.WriteLine("Die Anzahl der Tage ist: {0}", numberOfDays);

            Console.Read();
        }      
    }
}

Abgelegt unter datum, tage, anzahl, differenz, datetime.

6 Kommentare zum Snippet

Enrico Wüstenberg schrieb am 10/22/2019:
1 Stern. Zu einfach. Was ist mit verschiedenen Zeitzonen? Ist alles so 0815 was du schreibst. Sry.

Und nen Snippet ist es auch nicht. Sondern nur ein Aufruf in einer Konsolen Anwendung. Wenn du ein Snippet machst, mach eine fertig Methode draus.
FormFollowsFunction schrieb am 10/22/2019:
Ich kann da Enrico nur zustimmen !

Das Ergebnis als Double deklarieren, ist auch nicht das Gelbe vom Ei, dafür gibt es doch den Datentyp TimeSpan !
TimeSpan timespan = date2 - date1;
Koopakiller schrieb am 10/22/2019:
Kalender sind relativ kompliziert, deutlich mehr als das was wir aus unserem Alltag kennen. Da gibt es Schaltjahre, Schaltsekunden, Zeitzonen, verschiedene Kalender (und nicht alles lässt sich in jedem darstellen). Von daher sollte man sich schon etwas mit der Theorie hinter DateTime und TimeSpan auseinander setzen bevor man es einfach so verwendet. Denn .NET beachtet einige Besonderheiten, aber auch nicht alle.

@Enrico
DateTime kann nicht wirklich mit Zeitzonen umgehen. Es kennt im wesentlichen nur UTC, Local und Unspecified als DateTimeKind. Das kann u.A. dem Konstruktor mit übergeben werden. Fürs Konvertieren kann man beispielsweise System.TimeZoneInfo verwenden.

@FormFollowsFunction
Beim Subtrahieren von 2 DateTimes kommt ein TimeSpan-Objekt heraus. Dieses hat wiederum eine TotalDays-Eigenschaft die die gespeicherte Zeit-Länge in Form von Tagen mit Dezimalanteil ausgibt. Daher ist das ein double. Das ist in dem Snippet schon ok so wenn man wirklich die Tage haben will.
DateTime date1 = new DateTime(2018, 12, 24);
DateTime date2 = new DateTime(2019, 1, 21, 13, 4, 5);


Mein Kommentar zum Snippet selbst:
Es wird eine Basic-Funktionalität von .NET gezeigt ohne auf Feinheiten davon einzugehen. Einen wirklichen Mehrwert sehe ich hier nicht.
Würdest du beispielweise eine Funktion bauen die auch Zeitzonen etc. mit beachtet, dann wäre das für mich etwas mit einem Mehrwert. Auch wenn man dann genau klären müsste wie diese mit einbezogen werden und das könnte wiederum sehr vom Einzelfall abhängen.
(Beispiel: Wie viele Tage Abstand haben 01.01.2019 01:00 UTC+10 und 02.01.2019 07:00 UTC-2? 1 Tage [ganze Tage, Zeit ignorierend], 1.25 Tage [mit Dezimalangabe, Zeitzone ignorierend] oder 1.75 Tage [mit Dezimalangabe und Zeitzone]?)
FormFollowsFunction schrieb am 10/22/2019:
Wenn ich nur die Tage haben will, nutze ich die Eigenschaft TimeSpan.Days, so ist es gedacht und alles andere ist Murks.
Koopakiller schrieb am 10/22/2019:
Das ist kein "Murks", das hängt vom Anwendungsfall ab. Man kann auch mit halben Tagen arbeiten und genau dafür gibt es TotalDays. An sich gilt: Days = (int)TotalDays

Wobei man da bedenken sollte, dass Schaltsekunden bei beiden nicht beachtet werden.
FormFollowsFunction schrieb am 10/31/2019:
Wenn ich Zeit1 von Zeit2 subtrahiere, bekomme ich eine Zeitspanne.
Zeitspanne = Timespan, ergo ist Timespan DER zu bevorzugende DatenTyp.
Und wie du ja selbst sagst, hat man dort ja dort TotalDays zur verfühgung.
Alles andere ist schlechter Programierstil und damit Murks !
Durch die strikte Verwendung entsprechender DatenTypen, spart man sich im weiteren programierprozess so manche Umwandlung !

Nochmal zum "snippet": Date als auch DateTime halten die Funktion Subtract bereit, also ist dieses "snippet" so überflüssig wie nur was !
 

Logge dich ein, um hier zu kommentieren!