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;
}
}
Alte URL:
/snippet/anzahl-der-monate-zwischen-2-datetime-objekten-extension/1336
Find ich echt cool. Was noch geil wäre wenn du es als Extensionmethod für Datetime machst und alles wär Top 😀
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 😉
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:
[code]
var monthDiff = Math.Abs(datetime1.Month – datetime2.Month)
Console.Writeline(monthDiff); // ToString() kann man hier weglassen 😉
[/code]
@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.
@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 😉
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.
@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 😉
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…
@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. ^^