Як отримати останній день місяця?


324

Як я можу знайти останній день місяця в C #?

Наприклад, якщо у мене дата 03.08.1980, як мені отримати останній день 8 місяця (в даному випадку 31)?


2
@ Марк: Що я можу запитати? Думаю, для вашої власної відповіді не потрібен метод розширення.
абатищев

4
Останній день не визначений лише для місяця, вам потрібен і рік. В останній день лютого 2010 року становить 28, а в останній день лютого 2008 року складає 29
Guffa

@abatishchev Це не вимагає методу розширення, але це питання насправді не задається. Однак набагато приємніше і набагато легше читати, принаймні, як на мене, бачити його одним. Метод розширення був скоріше пропозицією, ніж чим-небудь. Будь-яке рішення працювало б методом розширення, а не лише моїм.
Марк

Відповіді:


653

Останній день місяця ви отримуєте такий, який повертається 31:

DateTime.DaysInMonth(1980, 08);

28
загальнодоступний статичний DateTime ConvertToLastDayOfMonth (DateTime date) {повернути новий DateTime (date.Year, дата.Month, DateTime.DaysInMonth (date.Year, date.Month)); }, щоб отримати останній день місяця у форматі дати
regisbsb

175
var lastDayOfMonth = DateTime.DaysInMonth(date.Year, date.Month);

@Henk Насправді я витягнув це з місця в нашому джерелі, яке створює DateTimeз lastDayOfMonth. Чесно кажучи, будь-який спосіб працює чудово. Це педантичний аргумент, який спосіб краще. Я робив це обома способами, і обидва дають однакову відповідь.
Марк

37

Якщо ви хочете дати , що дається місяць і рік, це здається правильним:

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

9

Суб'єктний день з першого числа наступного місяця:

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

Крім того, якщо вам це потрібно, щоб він працював і на грудень:

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

6

Ви можете знайти останню дату будь-якого місяця за цим кодом:

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

Останній день місяця ви можете знайти за одним рядком коду:

int maxdt = (new DateTime(dtfrom.Year, dtfrom.Month, 1).AddMonths(1).AddDays(-1)).Day;

Мене цікавить, що замість простого методу: DateTime.DaysInMonthчому б хтось шукав цей нечитабельний і складний спосіб його досягнення !? - Але як прийнятне рішення прийнятне;).
shA.t

5

З DateTimePicker:

Перше побачення:

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

Остання дата:

DateTime last_date = new DateTime(DateTimePicker.Value.Year, DateTimePicker.Value.Month, DateTime.DaysInMonth(DateTimePicker.Value.Year, DateTimePicker.Value.Month));

2

Отримати останній день місяця в конкретному календарі - і в методі розширення -:

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

Ця відповідь відповідає лише прикладом запитувача. Більш корисна відповідь була б кориснішою.
Скотт Лоуренс

Ви можете використовувати будь-яку дату, яку ви хочете, як вхідне значення, тому ви можете застосувати це рішення до будь-якої потрібної дати.
Джаспер Ріссьоу

1
Не вдасться до деяких дат, спробуйте var myDate = new DateTime(1980, 1, 31);(повертається 29-го)
Ганс Ке, що

Ганс Кенінг, ви праві. Цей метод не вдасться, якщо в наступному місяці буде менше днів, ніж у поточного. Я думаю, найпростіший спосіб - це використовувати DateTime.DaysInMonth (), але це прийнята відповідь, тому мою відповідь слід видалити.
Джаспер Ріссьоу

-1

Я не знаю C #, але якщо виявиться, що немає зручного способу отримати API, один із способів зробити це - дотримуючись логіки:

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

Звичайно, це передбачає, що у вас є математика дат такого типу.


Це не точно.
EJoshuaS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.