Jak uzyskać ostatni dzień miesiąca?

324

Jak mogę znaleźć ostatni dzień miesiąca w C #?

Na przykład, jeśli mam datę 03/08/1980, jak uzyskać ostatni dzień miesiąca 8 (w tym przypadku 31)?

Złoto
źródło
2
@Mark: Po co mogę prosić? Myślę, że twoja odpowiedź nie wymaga metody rozszerzenia.
abatishchev
4
Ostatni dzień nie jest specyficzny tylko dla miesiąca, potrzebujesz również roku. Ostatni dzień lutego 2010 r. To 28, ale ostatni dzień lutego 2008 r. To 29.
Guffa
@abatishchev Nie wymaga metody rozszerzenia, ale tak naprawdę nie wymaga tego pytanie. Jednak jest to o wiele ładniejsze i czytelniejsze, przynajmniej dla mnie, aby zobaczyć to jedno. Metoda rozszerzenia była raczej sugestią niż cokolwiek innego. Każde rozwiązanie działałoby w metodzie rozszerzenia, a nie tylko moje.
Mark

Odpowiedzi:

653

Ostatni dzień miesiąca wygląda następująco: 31

DateTime.DaysInMonth(1980, 08);
Oskar Kjellin
źródło
28
public static DateTime ConvertToLastDayOfMonth (data DateTime) {zwróć nowy DateTime (data.Rok, data.Miesiąc, DateTime.DaysInMonth (data.Rok, data.Miesiąc)); }, aby uzyskać ostatni dzień miesiąca w formacie daty
regisbsb
175
var lastDayOfMonth = DateTime.DaysInMonth(date.Year, date.Month);
znak
źródło
@Henk Właściwie ściągnąłem to z miejsca w naszym źródle, które tworzy DateTimez lastDayOfMonth. Szczerze mówiąc, oba sposoby działają idealnie dobrze. To pedantyczny argument, który sposób jest lepszy. Zrobiłem to na dwa sposoby i oba dają tę samą odpowiedź.
Mark
37

Jeśli chcesz mieć datę , biorąc pod uwagę miesiąc i rok, wydaje się to właściwe:

public static DateTime GetLastDayOfMonth(this DateTime dateTime)
{
    return new DateTime(dateTime.Year, dateTime.Month, DateTime.DaysInMonth(dateTime.Year, dateTime.Month));
}
pomimo
źródło
9

Odejmij dzień od pierwszego następnego miesiąca:

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

Ponadto, jeśli potrzebujesz, aby działał również w grudniu:

DateTime lastDay = new DateTime(MyDate.Year,MyDate.Month,1).AddMonths(1).AddDays(-1);
Radu094
źródło
6

Możesz znaleźć ostatnią datę dowolnego miesiąca według tego kodu:

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);
zacier
źródło
6

Ostatni dzień miesiąca możesz znaleźć w jednym wierszu kodu:

int maxdt = (new DateTime(dtfrom.Year, dtfrom.Month, 1).AddMonths(1).AddDays(-1)).Day;
jithin
źródło
Zastanawiam się, że zamiast prostej metody: DateTime.DaysInMonthdlaczego ktoś powinien szukać tego nieczytelnego i złożonego sposobu na osiągnięcie tego celu !? - Ale jako prawidłowe rozwiązanie jest do przyjęcia;).
shA.t 10.09.17
5

Od DateTimePicker:

Pierwsza randka:

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

Ostatnia randka:

DateTime last_date = new DateTime(DateTimePicker.Value.Year, DateTimePicker.Value.Month, DateTime.DaysInMonth(DateTimePicker.Value.Year, DateTimePicker.Value.Month));
Md. Shafiqur Rahman
źródło
2

Aby uzyskać ostatni dzień miesiąca w określonym kalendarzu - i w metodzie rozszerzenia -:

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
źródło
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
źródło
Ta odpowiedź odpowiada tylko na przykład pytającego. Bardziej wyczerpująca odpowiedź byłaby bardziej pomocna.
Scott Lawrence
Możesz użyć dowolnej daty jako wartości wejściowej, dzięki czemu możesz zastosować to rozwiązanie do dowolnej daty.
Jasper Risseeuw
1
W niektórych datach się nie powiedzie, spróbuj var myDate = new DateTime(1980, 1, 31);(zwraca 29)
Hans Ke sting
Hans Keinging, masz rację. Ta metoda zawiedzie, jeśli następny miesiąc będzie miał mniej dni niż obecny. Wydaje mi się, że najłatwiejszym sposobem jest użycie DateTime.DaysInMonth (), ale jest to zaakceptowana odpowiedź, więc moja odpowiedź powinna zostać usunięta.
Jasper Risseeuw
-1

Nie znam C #, ale jeśli okaże się, że nie ma wygodnego sposobu na uzyskanie API, jednym ze sposobów możesz to zrobić, postępując zgodnie z logiką:

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

Oczywiście zakłada to, że masz matematykę tego typu.

RHSeeger
źródło
To nie jest dokładne.
EJoshuaS - Przywróć Monikę