2010-11-02 15 views
69

Eventuali duplicati:
How to get the last day of a month?Come trovi l'ultimo giorno del mese?

Finora, ho questo:

DateTime createDate = new DateTime(year, month, 1).AddMonths(1).AddDays(-1); 

C'è un modo migliore?

+7

Hai mai scritto il tuo calendario prima? Questa è una fantastica soluzione al confronto. : D – Neil

+0

Basta guardare indietro a questo post, come potrebbe essere un duplicato? La mia domanda pone un modo, e poi chiede se c'è qualcosa di meglio. Quello a cui si fa riferimento sta solo chiedendo un metodo. – Irwin

risposta

181

Come sull'utilizzo DaysInMonth:

DateTime createDate = new DateTime (year, month, 
            DateTime.DaysInMonth(year, month)); 

(Nota a sé - deve fare questo facile in Noda Time ...)

+0

@JonSkeet Lo hai mai fatto in NodaTime, o è ancora il modo migliore per farlo? –

+0

@ BenJenkinson: è sicuramente ancora il modo migliore al momento. Nel 2.0 potresti usare un 'DateAdjuster' - non ce n'è uno per' LastDayOfMonth' al momento, ma potrei aggiungerne uno stasera :) –

+1

@BenJenkinson: Ha - si scopre che * l'ho * già fatto - 'DateAdjusters .EndOfMonth'. –

19

È possibile utilizzare il metodo DateTime.DaysInMonth(year,month) per ottenere il numero di giorni in un dato mese.

1

se siete interessati a una versione codice personalizzato:

var anyDt = DateTime.Now; 
var lastDayOfMonth = anyDt.AddMonths(1).AddDays(anyDt.AddMonths(1).Day).Date; 

o:

var anyDt = DateTime.Now; 
var lastDayOfMonth = anyDt.AddDays(1-anyDt.Day).AddMonths(1).AddDays(-1).Date; 

o come un metodo:

DateTime LastDayInMonth(DateTime anyDt) 
    { return anyDt.AddMonths(1).AddDays(anyDt.AddMonths(1).Day).Date; } 

o come un metodo di estensione:

DateTime LastDayInMonth(DateTime this anyDt) 
    { return anyDt.AddMonths(1).AddDays(anyDt.AddMonths(1).Day).Date; } 
+0

Nella migliore delle ipotesi, questo codice restituisce il primo giorno del mese successivo, non l'ultimo giorno del mese corrente. Inoltre, si imbatte in problemi quando si gestiscono mesi con diverso numero di giorni. Se oggi fosse 1/4/2017, questo codice restituirà il 2/1/2017. Se oggi fosse il 31/31/2017, questo codice restituirà il 1/29/2017. –

5

Ecco un approccio elegante che ho trovato in un utile biblioteca di estensione DateTime su CodePlex:

http://datetimeextensions.codeplex.com/

Ecco alcuni esempi di codice:

public static DateTime First(this DateTime current) 
    { 
     DateTime first = current.AddDays(1 - current.Day); 
     return first; 
    } 

    public static DateTime First(this DateTime current, DayOfWeek dayOfWeek) 
    { 
     DateTime first = current.First(); 

     if (first.DayOfWeek != dayOfWeek) 
     { 
      first = first.Next(dayOfWeek); 
     } 

     return first; 
    } 

    public static DateTime Last(this DateTime current) 
    { 
     int daysInMonth = DateTime.DaysInMonth(current.Year, current.Month); 

     DateTime last = current.First().AddDays(daysInMonth - 1); 
     return last; 
    } 

Ha alcune altre utili estensioni e che possono essere utile a voi

Problemi correlati