2010-03-09 15 views
27

Normalmente utilizo el siguiente código, pero ¿hay una manera mejor?Último día del mes en .NET

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

Definir "mejor". –

+0

Creo que solo una función proporcionada por la API haría un mejor trabajo. –

+1

¿Quieres un tiempo específico? Si no, debes usar Today, not Now. –

Respuesta

49

utilizo

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

Usted puede utilizar CultureInfo.CurrentCulture.Calendar.GetDaysInMonth (Now.Year, Now.Month)

12

utilizaría probablemente DaysInMonth ya que hace el código es un poco más legible y más fácil de entender (aunque, realmente me gusta tu truco :-)). Este requieres un ammount similar de mecanografía (que es bastante), así que probablemente sería definir un método de extensión:

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

Ahora podemos usar DateTime.Now.LastDayOfMonth() la que se ve mucho mejor :-).

2

Aquí es cómo se puede obtener el número de días del mes usando Noda Time:

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

Bastante simple, ¿verdad? Bueno, eso supone que sabes el año y el mes sobre el que preguntas. Si usted lo desea para el actual al mes, y en la zona hora del sistema , entonces usted tiene que especificar que de forma explícita, como esto:

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

Noda El tiempo hace intencionadamente se piensa en estas cosas, en lugar de simplemente haciendo las suposiciones que hacen DateTime.Now o DateTime.Today.

Cuestiones relacionadas