Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1551 | Anzahl registrierter User: 1841 | Besucher online: 161
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Anzahl der Monate zwischen 2 DateTime-Objekten (Extension)


Autor: Sascha König
Sprache: C#
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 4530
  
Kick it on dotnet-kicks.de  

Beschreibung:

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


Abgelegt unter: Monat, Datum, DateTime, Extension, Zeitraum.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
    }
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Christopher Kk schrieb am:  17.02.2010 18:52:51

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 19:49:36

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 20:06:51

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 20:19:41

@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 11:23:42

@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 11:49:41

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 12:09:25

@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 12:33:45

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 13:31:34

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


Diese Snippets könnten für Sie interessant sein:
[C#] ersten und letzten Tag im Monat berechnen
[C#] Datumsformatierung mit ToString
[C#] Datum in Unix-Timestamp wandeln
[C#] Unix Timestamp in Datum wandeln
[C#] Datum in das RFC822 Format umwandeln
[C#] Atomuhr-Datum von einem NIST-Server abfragen
[C#] Kalenderwoche berechnen
[C#] Den ersten und den letzten Tag eines Quartals berechnen
[C#] Ostersonntag und Ostermontag ermitteln
[C#] Datum und Zeit als String
[VB.NET] Zufälliges Datum erzeugen
[C#] Zufälliges Datum erzeugen
[C#] Datum des nächsten Quartalsendes
[C#] zeigt den letzten Tag eines Monates an
[C#] Aus Datum Wochentag ermitteln
[C#] Atomic DateTime holen und PC-DateTime updaten
[C#] Setzen der Systemzeit
[C#] DateTime in besser lesbaren String umwandeln
[C#] Formatierte Uhrzeiten für die Zeitauswahl erzeugen.
[C#] DateTime Extensions liefern TimeStamp
[C#] Alter anhand des Geburtstages ermitteln.
[C#] yyyymmdd - String in DateTime wandeln
[C#] DateTime in yyyymmdd - String wandeln
[C#] Datum vor genau einem Monat ermitteln
[C#] Sternzeichen bestimmen
[C#] ersten und letzten Tag der Woche berechnen
[C#] Herausfinden, ob ein Jahr ein Schaltjahr ist
[C#] DateTime Runden
[C#] Datei/Ordner durch Erweiterungsmethoden abfragen
[C#] Programmpfad mittels Erweiterung ermitteln
[C#] Invoke Beispiel mittels Erweiterungs Methoden.
[C#] Komplette Exception Message (inkl. InnerExceptions) ausgeben
[VB.NET] Programmpfad mittels Erweiterung ermitteln in VB
[C#] LINQ-Erweiterung für eindeutige Liste
[C#] Type Color serialisieren und deserialisieren
[C#] Controls gleichen Typs von einem Container in Winform holen
[C#] Extension in einem Dateinamen/Pfad ändern
[C#] Threadsicherer Codeaufruf im Control-Kontext (Invoking)
[C#] Selektieren eines gekapselten Eintrags aus der ComboBox
[C#] Color Extension-Methods
[C#] IsNull and IsNullOrEmpty Extension-Methods become Lazy
[C#] Enum-Extension - Flag in einem Bitfeld gesetzt?
[C#] "for" mal anders
[C#] Generische Event Args -> EventArgs
[C#] Lazy Serialization-Extensions including Compression
[C#] SystemIconsImageListWrapper

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.