Feedback

C# - Anzahl der Monate zwischen 2 DateTime-Objekten (Extension)

Veröffentlicht von am 16.02.2010
(2 Bewertungen)
Diese Klasse erweitert die DateTime-Klasse um folgende Methode: getMonthsBetweenDates

Die Methode liefert die Anzahl der vollen Monate zwischen 2 DateTime-Objekten zurück.

Da die DateTime-Objekte intern sortiert werden, ist es egal in welcher Reihenfolge sie übergeben werden.

z.B.:
01.10.09 - 15.10.09 ergibt 0 Monate
01.10.09 - 01.11.09 ergibt 1 Monat
01.10.09 - 16.02.10 ergibt 4 Monate
etc.

Beispielaufruf:

int value = DateTime.Now.getMonthsBetweenDates(DateTime.Now.AddMonths(-13));
Console.WriteLine(value);
// Ausgabe liefert: 13
GFU-Schulungen  [Anzeige]

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

public static class DateTimeExtension {

    public static int getMonthsBetweenDates(this DateTime Date1, DateTime Date2) {
        // Beide Daten in einer Liste speichern und sortieren 
        List<DateTime> period = new List<DateTime>() { Date1, Date2 };
        period.Sort(DateTime.Compare);

        // Monate zählen
        int months;
        for (months = 0; period[0].AddMonths(months + 1).CompareTo(period[1]) <= 0; months++) ;

        return months;
    }
}
Abgelegt unter Monat, Datum, DateTime, Extension, Zeitraum.

9 Kommentare zum Snippet

Christopher Kk schrieb am 17.02.2010:
Find ich echt cool. Was noch geil wäre wenn du es als Extensionmethod für Datetime machst und alles wär Top :D
Christopher Kk schrieb am 17.02.2010:
Wobei mir grad einfällt, was spricht denn gegen folgendes

Console.Writeline(Math.Abs(datetime1.Month - datetime2.Month).ToString());


Kommt doch aufs selbe raus oder nicht ;)
ThomasMentzel schrieb am 17.02.2010:
Es ist einfach nur schwieriger zu lesen. In gewisser Weise hat es mit dem "One Level Of Abstraction" zu tun: http://clean-code-developer.de/wiki/CcdOrangerGrad#Onelevelofabstraction

Einfacher zu lesen wäre:

var monthDiff = Math.Abs(datetime1.Month - datetime2.Month)
Console.Writeline(monthDiff); // ToString() kann man hier weglassen ;)
Christopher Kk schrieb am 17.02.2010:
@thomase, ja is mir schon klar. man kann das auch einfach in die Funktion des Snippet erstellers einlagen und die Month anzahl zurückgeben, dann hat man es noch unabhängiger.
Sascha König schrieb am 18.02.2010:
@Christopher
Danke für dein Feedback ;)
Zu deiner Frage:
Math.Abs(datetime1.Month - datetime2.Month)

liefert leider ein falsches Ergebnis sobald ein Jahreswechsel dazwischenliegt.
Nimm mal an du hast den Zeitraum: 01.09.09 - 01.01.10, dann liefert eine normale Substraktion der Monate in deinem Fall entweder: 1-9 = |8| oder 9-1 = 8
In Wirklichkeit liegen aber 4 Monate dazwischen.
Noch schlimmer ist der Fall natürlich wenn mehrere Jahre dazwischen liegen:
01.01.07 - 01.02.09
Substraktion: 1 Monat Differenz
Obige Methode: 25 Monate Differenz

Die Idee mit der Extensionsmethode ist gut ... werd mich drum kümmern ;)
Sascha König schrieb am 18.02.2010:
Mir ist nochwas eingefallen:

Bei einer reinen Substraktion der Monate werden die Tage nicht mit berücksichtigt.
Denn zwischen 12.04.09 und 07.05.09 liegt kein ganzer Monat. ;)

Die obige Funktion gibt nämlich die vollen Monate zwischen 2 Daten zurück.
Christopher Kk schrieb am 18.02.2010:
@alle, stimmt ihr habt recht, ich habe mir das nicht genau genug durchdacht ;)
Danke für die netten Hinweise, dann ist mein Vorschlag natürlich nicht so praktikabel ;)
Michael Klaus schrieb am 18.02.2010:
das mit dem Jahrewechsel lässt sich ganz einfach regeln, in dem man (12*Year2+Month2)-(12*Year1+Month1) berechnet.
liefert allerdings keine Lösung für die "ganzen" Monate...
Sascha König schrieb am 18.02.2010:
@Christopher:
Macht doch nix ;) Genau über diesen Weg hatte ich anfangs auch das Problem lösen wollen ... hat dann aber logischerweise nicht so hingehauen wie ich wollte :)

@Michael:
Stimmt, das is ne gute Idee. ^^
 

Logge dich ein, um hier zu kommentieren!