Feedback

Anzahl der Monate zwischen 2 DateTime-Objekten (Extension)

Sprache: C#

Diese Klasse erweitert die DateTime-Klasse um folgende Methode: getMonthsBetweenDates Die Methode liefert die Anzahl der [b]vollen[/b] 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: [code] int value = DateTime.Now.getMonthsBetweenDates(DateTime.Now.AddMonths(-13)); Console.WriteLine(value); // Ausgabe liefert: 13 [/code]
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;
    }
}
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;
    }
}

9 Kommentare

  1. Find ich echt cool. Was noch geil wäre wenn du es als Extensionmethod für Datetime machst und alles wär Top 😀

  2. Wobei mir grad einfällt, was spricht denn gegen folgendes
    [code]
    Console.Writeline(Math.Abs(datetime1.Month – datetime2.Month).ToString());
    [/code]

    Kommt doch aufs selbe raus oder nicht 😉

  3. @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.

  4. @Christopher
    Danke für dein Feedback 😉
    Zu deiner Frage:
    [code]Math.Abs(datetime1.Month – datetime2.Month)[/code]
    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 😉

  5. 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 [b]vollen[/b] Monate zwischen 2 Daten zurück.

  6. @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 😉

  7. 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…

  8. @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. ^^