Como recebo o último dia do mês?

326

Como posso encontrar o último dia do mês em c #?

Por exemplo, se eu tenho a data 03/08/1980, como obtenho o último dia do mês 8 (neste caso, 31)?

Ouro
fonte
2
@ Mark: O que posso perguntar? Sua própria resposta não requer um método de extensão, eu acho.
abatishchev
4
O último dia não é específico apenas para o mês, você também precisa do ano. O último dia de fevereiro de 2010 é 28, mas o último dia de fevereiro de 2008 é 29.
Guffa 22/03/10
@abatishchev Não requer um método de extensão, mas a pergunta realmente não é solicitada. No entanto, é muito melhor e muito mais legível, pelo menos para mim, vê-lo um. O método de extensão foi mais uma sugestão do que qualquer coisa. Qualquer solução funcionaria em um método de extensão, não apenas no meu.
Mark

Respostas:

657

O último dia do mês em que você fica assim, retorna 31:

DateTime.DaysInMonth(1980, 08);
Oskar Kjellin
fonte
28
public estático DateTime ConvertToLastDayOfMonth (DateTime date) {retorna novo DateTime (date.Year, date.Month, DateTime.DaysInMonth (date.Year, date.Month)); } para obter o último dia do mês em um formato de data
regisbsb
177
var lastDayOfMonth = DateTime.DaysInMonth(date.Year, date.Month);
Marca
fonte
@ Henk Na verdade, eu puxei isso de um lugar em nossa fonte que cria o DateTimede lastDayOfMonth. Honestamente, de qualquer maneira funciona perfeitamente bem. É um argumento pedante de que maneira é melhor. Eu fiz isso de duas maneiras e ambas produzem a mesma resposta.
Mark
37

Se você quer a data , dado um mês e um ano, isso parece correto:

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

Subtraia um dia a partir do primeiro mês que vem:

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

Além disso, caso você também precise trabalhar para dezembro:

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

Você pode encontrar a última data de qualquer mês por este código:

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);
amassar
fonte
6

Você pode encontrar o último dia do mês por uma única linha de código:

int maxdt = (new DateTime(dtfrom.Year, dtfrom.Month, 1).AddMonths(1).AddDays(-1)).Day;
jithin
fonte
Está me perguntando que, em vez de um método simples: DateTime.DaysInMonthpor que alguém deveria procurar essa maneira ilegível e complexa de alcançá-la !? - Mas como uma solução válida é aceitável;).
shA.t
5

De DateTimePicker:

Primeiro encontro:

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

Última data:

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

Para obter o último dia do mês em um calendário específico - e em um método de extensão -:

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
fonte
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
fonte
Essa resposta responde apenas ao exemplo do questionador. Uma resposta mais abrangente seria mais útil.
Scott Lawrence
Você pode usar qualquer data que desejar como valor de entrada, para poder aplicar esta solução a qualquer data que desejar.
Jasper Risseeuw 15/10/1918
1
Ele falhará em algumas datas, tente var myDate = new DateTime(1980, 1, 31);(retorna o dia 29) #
501 Hans
Hans Keing, você está certo. Este método falhará se o próximo mês tiver menos dias que o atual. Eu acho que a maneira mais fácil é usar DateTime.DaysInMonth (), mas essa é a resposta aceita, então minha resposta deve ser excluída.
Jasper Risseeuw 15/10/1918
-1

Eu não sei C #, mas, se não houver uma maneira conveniente de obter API, uma das maneiras de fazer isso é seguindo a lógica:

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

Obviamente, isso pressupõe que você tenha a matemática da data desse tipo.

RHSeeger
fonte
Isso não é exato.
EJoshuaS - Restabelece Monica