Wie bekomme ich den letzten Tag eines Monats?

324

Wie finde ich den letzten Tag des Monats in C #?

Wenn ich beispielsweise das Datum 03/08/1980 habe, wie erhalte ich den letzten Tag des 8. Monats (in diesem Fall 31)?

Gold
quelle
2
@ Mark: Wofür darf ich fragen? Ihre eigene Antwort erfordert keine Erweiterungsmethode, denke ich.
Abatishchev
4
Der letzte Tag ist nicht nur für den Monat spezifisch, Sie benötigen auch das Jahr. Der letzte Tag im Februar 2010 ist 28, aber der letzte Tag im Februar 2008 ist 29.
Guffa
@abatishchev Es ist keine Erweiterungsmethode erforderlich , aber die Frage fragt nicht wirklich danach. Es ist jedoch viel schöner und viel lesbarer, zumindest für mich, es zu sehen. Die Erweiterungsmethode war mehr ein Vorschlag als alles andere. Jede Lösung würde in einer Erweiterungsmethode funktionieren, nicht nur in meiner.
Mark

Antworten:

653

Der letzte Tag des Monats, den Sie so erhalten, gibt 31 zurück:

DateTime.DaysInMonth(1980, 08);
Oskar Kjellin
quelle
28
public static DateTime ConvertToLastDayOfMonth (DateTime-Datum) {neues DateTime zurückgeben (date.Year, date.Month, DateTime.DaysInMonth (date.Year, date.Month)); }, um den letzten Tag des Monats in einem Datumsformat zu erhalten
regisbsb
175
var lastDayOfMonth = DateTime.DaysInMonth(date.Year, date.Month);
Kennzeichen
quelle
@Henk Eigentlich habe ich das von einem Ort in unserer Quelle gezogen, der das DateTimeaus dem erstellt lastDayOfMonth. Ehrlich gesagt funktioniert so oder so perfekt. Es ist ein pedantisches Argument, welcher Weg besser ist. Ich habe es in beide Richtungen gemacht und beide geben die gleiche Antwort.
Mark
84
DateTime firstOfNextMonth = new DateTime(date.Year, date.Month, 1).AddMonths(1);
DateTime lastOfThisMonth = firstOfNextMonth.AddDays(-1);
Henk Holterman
quelle
1
"Wie bekomme ich den letzten Tag eines Monats?" DateTime.DaysInMonth (Jahr, Monat) gibt zurück, wie viele Tage der Monat hat. Dies gibt die gleiche Antwort für "Was ist der letzte Tag des Monats?" Zurück. Ihr Weg funktioniert, aber ich denke, es ist zu viel Code für eine einfache Sache.
Rochasdv
@rochasdv Dieses DateTime.DaysInMonth (Jahr, Monat) gibt int zurück, aber ich möchte ein DateTime-Objekt. In diesem Fall sind beide Antwortcodes gleich. int daysInMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month); DateTime lastDayOfMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
Ammar
37

Wenn Sie das Datum für einen Monat und ein Jahr angeben möchten , scheint dies ungefähr richtig zu sein:

public static DateTime GetLastDayOfMonth(this DateTime dateTime)
{
    return new DateTime(dateTime.Year, dateTime.Month, DateTime.DaysInMonth(dateTime.Year, dateTime.Month));
}
trotz
quelle
9

Ziehen Sie einen Tag vom ersten des nächsten Monats ab:

DateTime lastDay = new DateTime(MyDate.Year,MyDate.Month+1,1).AddDays(-1);

Falls Sie es auch für Dezember benötigen:

DateTime lastDay = new DateTime(MyDate.Year,MyDate.Month,1).AddMonths(1).AddDays(-1);
Radu094
quelle
6

Sie können das letzte Datum eines Monats anhand dieses Codes ermitteln:

var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year, now.Month, 1);
var DaysInMonth = DateTime.DaysInMonth(now.Year, now.Month);
var lastDay = new DateTime(now.Year, now.Month, DaysInMonth);
Maische
quelle
6

Sie finden den letzten Tag des Monats in einer einzigen Codezeile:

int maxdt = (new DateTime(dtfrom.Year, dtfrom.Month, 1).AddMonths(1).AddDays(-1)).Day;
Jithin
quelle
Ich frage mich DateTime.DaysInMonth, warum statt einer einfachen Methode jemand nach diesem unlesbaren und komplexen Weg suchen sollte, um dies zu erreichen!? - Aber als gültige Lösung ist akzeptabel;).
shA.t
5

Von DateTimePicker:

Erste Verabredung:

DateTime first_date = new DateTime(DateTimePicker.Value.Year, DateTimePicker.Value.Month, 1);

Letztes Datum:

DateTime last_date = new DateTime(DateTimePicker.Value.Year, DateTimePicker.Value.Month, DateTime.DaysInMonth(DateTimePicker.Value.Year, DateTimePicker.Value.Month));
Md. Shafiqur Rahman
quelle
2

So erhalten Sie den letzten Tag eines Monats in einem bestimmten Kalender - und in einer Erweiterungsmethode -:

public static int DaysInMonthBy(this DateTime src, Calendar calendar)
{
    var year = calendar.GetYear(src);                   // year of src in your calendar
    var month = calendar.GetMonth(src);                 // month of src in your calendar
    var lastDay = calendar.GetDaysInMonth(year, month); // days in month means last day of that month in your calendar
    return lastDay;
}
shA.t.
quelle
2
// Use any date you want, for the purpose of this example we use 1980-08-03.
var myDate = new DateTime(1980,8,3);
var lastDayOfMonth = new DateTime(myDate.Year, myDate.Month, DateTime.DaysInMonth(myDate.Year, myDate.Month));
Jasper Risseeuw
quelle
Diese Antwort entspricht nur dem Beispiel des Fragestellers. Eine umfassendere Antwort wäre hilfreicher.
Scott Lawrence
Sie können ein beliebiges Datum als Eingabewert verwenden, um diese Lösung auf ein beliebiges Datum anzuwenden.
Jasper Risseeuw
1
Es wird für einige Daten fehlschlagen, versuchen Sie es var myDate = new DateTime(1980, 1, 31);(gibt den 29. zurück)
Hans
Hans Keing, Sie haben recht. Diese Methode schlägt fehl, wenn der nächste Monat weniger Tage als der aktuelle hat. Ich denke, der einfachste Weg ist die Verwendung von DateTime.DaysInMonth (), aber das ist die akzeptierte Antwort, daher sollte meine Antwort gelöscht werden.
Jasper Risseeuw
-1

Ich kenne C # nicht, aber wenn sich herausstellt, dass es keinen bequemen API-Weg gibt, um es zu bekommen, können Sie dies folgendermaßen tun, indem Sie der Logik folgen:

today -> +1 month -> set day of month to 1 -> -1 day

Dies setzt natürlich voraus, dass Sie eine Datumsmathematik dieses Typs haben.

RHSeeger
quelle
Das ist nicht richtig.
EJoshuaS