Come posso ottenere l'ultimo giorno del mese?


326

Come posso trovare l'ultimo giorno del mese in C #?

Ad esempio, se ho la data del 03/08/1980, come posso ottenere l'ultimo giorno del mese 8 (in questo caso 31)?


2
@Mark: a cosa posso chiedere? La tua risposta non richiede un metodo di estensione, credo.
abatishchev,

4
L'ultimo giorno non è specifico del solo mese, è necessario anche l'anno. L'ultimo giorno di febbraio 2010 è il 28, ma l'ultimo giorno di febbraio 2008 è il 29.
Guffa,

@abatishchev Non richiede un metodo di estensione, ma la domanda non lo richiede davvero. Tuttavia, è molto più bello e molto più leggibile, almeno per me, vederlo uno. Il metodo di estensione era più un suggerimento che altro. Qualsiasi soluzione funzionerebbe con un metodo di estensione, non solo mio.
Segna il

Risposte:


657

L'ultimo giorno del mese ottieni così, che restituisce 31:

DateTime.DaysInMonth(1980, 08);

28
public DateTime statico ConvertToLastDayOfMonth (data DateTime) {return new DateTime (date.Year, date.Month, DateTime.DaysInMonth (date.Year, date.Month)); } per ottenere l'ultimo giorno del mese in un formato data
regisbsb

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

@Henk In realtà l'ho estratto da un posto nella nostra fonte che crea il DateTimeda lastDayOfMonth. Onestamente in entrambi i casi funziona perfettamente. È un argomento pedante in che modo è meglio. L'ho fatto in entrambi i modi ed entrambi danno la stessa risposta.
Segna il

37

Se vuoi la data , dato un mese e un anno, questo sembra giusto:

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

9

Sottrai un giorno dal primo del prossimo mese:

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

Inoltre, nel caso in cui ne abbiate bisogno per funzionare anche a dicembre:

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

6

Puoi trovare l'ultima data di ogni mese con questo codice:

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

Puoi trovare l'ultimo giorno del mese con una singola riga di codice:

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

Mi chiedo che invece di un metodo semplice: DateTime.DaysInMonthperché qualcuno dovrebbe cercare questo modo illeggibile e complesso per raggiungerlo !? - Ma come soluzione valida è accettabile;).
shA.t,

5

A partire dal DateTimePicker:

Primo appuntamento:

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

Ultimo appuntamento:

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

2

Per ottenere l'ultimo giorno di un mese in un calendario specifico e in un metodo di estensione:

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

Questa risposta risponde solo all'esempio dell'interrogatore. Una risposta più completa sarebbe più utile.
Scott Lawrence,

È possibile utilizzare qualsiasi data desiderata come valore di input, quindi è possibile applicare questa soluzione a qualsiasi data desiderata.
Jasper Risseeuw,

1
Fallirà per alcune date, prova var myDate = new DateTime(1980, 1, 31);(restituisce il 29)
Hans Ke il

Hans Ke, hai ragione. Questo metodo fallirà se il mese successivo ha meno giorni di quello corrente. Immagino che il modo più semplice sia usare DateTime.DaysInMonth () ma questa è la risposta accettata, quindi la mia risposta dovrebbe essere cancellata.
Jasper Risseeuw,

-1

Non conosco C # ma, se si scopre che non esiste un modo API conveniente per ottenerlo, uno dei modi per farlo è seguire la logica:

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

Naturalmente, ciò presuppone che tu abbia una matematica di data di quel tipo.


Questo non è accurato
EJoshuaS - Ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.