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

Oro
fuente
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);
Oskar Kjellin
fuente
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);
marca
fuente
@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));
}
A pesar de
fuente
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);
Radu094
fuente
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);
mezcla
fuente
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;
jithin
fuente
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));
MD Shafiqur Rahman
fuente
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;
}
shA.t
fuente
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
fuente
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.

RHSeeger
fuente
Esto no es exacto.
EJoshuaS - Restablece a Monica el