Как мне получить последний день месяца?

326

Как я могу найти последний день месяца в C #?

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

Золото
источник
2
@Mark: зачем мне спрашивать? Ваш собственный ответ не требует метода расширения, я думаю.
абатищев
4
Последний день не относится только к месяцу, вам также нужен год. Последний день февраля 2010 года - 28, но последний день февраля 2008 года - 29.
Гуффа
@abatishchev Это не требует метода расширения, но вопрос на самом деле не требует его. Тем не менее, гораздо приятнее и читабельнее, по крайней мере для меня, увидеть его. Метод расширения был скорее предложением, чем чем-либо. Любое решение будет работать в методе расширения, а не только в моем.
Марк

Ответы:

657

Последний день месяца, который вы получаете, как это, который возвращает 31:

DateTime.DaysInMonth(1980, 08);
Оскар Кьеллин
источник
28
public static DateTime ConvertToLastDayOfMonth (DateTime date) {вернуть новый DateTime (date.Year, date.Month, DateTime.DaysInMonth (date.Year, date.Month)); } чтобы получить последний день месяца в формате даты
regisbsb
177
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);
Radu094
источник
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;
jithin
источник
Меня удивляет, что вместо простого метода: DateTime.DaysInMonthпочему кто-то должен искать этот нечитаемый и сложный способ добиться этого !? - но в качестве действительного решения это приемлемо;).
17
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;
}
shA.t
источник
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

Конечно, это предполагает, что у вас есть дата математика этого типа.

RHSeeger
источник
Это не точно.
EJoshuaS - Восстановить Монику