Feedback

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

Veröffentlicht von am 2/16/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
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 2/17/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 2/17/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 2/17/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 2/17/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 2/18/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 2/18/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 2/18/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 2/18/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 2/18/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!