¿Cómo obtengo el último día de un mes?


326

¿Cómo puedo encontrar el último día del mes en C #?

Por ejemplo, si tengo la fecha 03/08/1980, ¿cómo obtengo el último día del mes 8 (en este caso 31)?


2
@ Mark: ¿Para qué puedo preguntar? Creo que su propia respuesta no requiere un método de extensión.
abatishchev

44
El último día no es específico solo para el mes, también necesita el año. El último día de febrero de 2010 es el 28, pero el último día de febrero de 2008 es el 29.
Guffa

@abatishchev No requiere un método de extensión, pero la pregunta realmente no lo pide. Sin embargo, es mucho más agradable y mucho más legible, al menos para mí, verlo. El método de extensión fue más una sugerencia que otra cosa. Cualquier solución funcionaría en un método de extensión, no solo el mío.
Mark

Respuestas:


657

El último día del mes obtienes así, que devuelve 31:

DateTime.DaysInMonth(1980, 08);

28
public static DateTime ConvertToLastDayOfMonth (DateTime date) {return new DateTime (date.Year, date.Month, DateTime.DaysInMonth (date.Year, date.Month)); } para obtener el último día del mes en un formato de fecha
regisbsb

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

@Henk En realidad, saqué esto de un lugar en nuestra fuente que crea el DateTimede lastDayOfMonth. Honestamente, de cualquier manera funciona perfectamente bien. Es un argumento pedante de qué manera es mejor. Lo he hecho en ambos sentidos y ambos dan la misma respuesta.
Mark

37

Si desea la fecha , dado un mes y un año, esto parece correcto:

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

9

Resta un día del primero del próximo mes:

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

Además, en caso de que también lo necesite para diciembre:

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

6

Puede encontrar la última fecha de cualquier mes 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);

6

Puede encontrar el último día del mes por una sola línea de código:

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

Me pregunta que, en lugar de un método simple DateTime.DaysInMonth, ¿por qué alguien debería buscar esta forma ilegible y compleja de lograrlo? - Pero como una solución válida es aceptable;).
shA.t

5

De DateTimePicker:

Primera fecha:

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

Ultima cita:

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

2

Para obtener el último día de un mes en un calendario específico y en un método de extensión:

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

Esta respuesta responde solo al ejemplo del interlocutor. Una respuesta más completa sería más útil.
Scott Lawrence

Puede usar cualquier fecha que desee como valor de entrada, por lo que puede aplicar esta solución a cualquier fecha que desee.
Jasper Risseeuw

1
Fallará para algunas fechas, intente var myDate = new DateTime(1980, 1, 31);(regresa el 29)
Hans Ke sting

Hans Keing, tienes razón. Este método fallará si el próximo mes tiene menos días que el actual. Supongo que la forma más fácil es usar DateTime.DaysInMonth () pero esa es la respuesta aceptada, por lo que mi respuesta debe eliminarse.
Jasper Risseeuw

-1

No sé C # pero, si resulta que no hay una forma API conveniente de obtenerlo, una de las formas en que puede hacerlo es siguiendo la lógica:

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

Por supuesto, eso supone que tienes matemática de fechas de ese tipo.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.