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)?


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);

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);

@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));
}

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);

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);

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;

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));

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;
}

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));

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.


To nie jest dokładne.
EJoshuaS - Przywróć Monikę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.