2010-03-09 12 views
27

Normalmente utilizzo il codice seguente, ma esiste un modo migliore?Ultimo giorno del mese in. NET

lastOfMonth = new DateTime(Now.Year, Now.Month, 1).AddMonths(1).AddDays(-1) 
+3

Definire "migliore". –

+0

Penso che solo una funzione fornita dall'API farebbe un lavoro migliore. –

+1

Vuoi un orario specifico? Se no, dovresti usare oggi, non ora. –

risposta

49

Io uso

DateTime now = DateTime.Today; 
var lastDate = new DateTime(now.Year, now.Month, DateTime.DaysInMonth(now.Year, now.Month)); 
8
DateTime(year, month, DateTime.DaysInMonth(year, month)). 
3

È possibile utilizzare CultureInfo.CurrentCulture.Calendar.GetDaysInMonth (Now.Year, Now.Month)

12

avrei probabilmente usare DaysInMonth quanto rende il codice un po 'più leggibile e più facile da capire (anche se mi piace molto il tuo trucco :-)). Questo requieres una simile quantità degli tipizzazione (che è un bel po '), così ho probabilmente definire un metodo di estensione:

DateTime LastDayOfMonth(this DateTime) { 
    var days = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month); 
    return new DateTime(DateTime.Now.Year, DateTime.Now.Month, days); 
} 

Ora possiamo usare DateTime.Now.LastDayOfMonth() che sembra molto meglio :-).

2

Ecco come è possibile ottenere il numero di giorni del mese con Noda Time:

int days = CalendarSystem.Iso.GetDaysInMonth(year, month); 

Abbastanza semplice, eh? Beh, questo presuppone che tu sappia l'anno e il mese che stai chiedendo. Se si desidera per la corrente mesi , e in il fuso orario del sistema , poi si deve specificare che in modo esplicito, in questo modo:

DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault(); 
LocalDate localDate = SystemClock.Instance.Now.InZone(tz).Date; 
int days = localDate.Calendar.GetDaysInMonth(localDate.Year, localDate.Month); 

Noda Tempo fa intenzionalmente si pensa a queste cose, invece di facendo solo le supposizioni che fanno DateTime.Now o DateTime.Today.

Problemi correlati