2010-11-02 16 views
69

Duplicar posible:
How to get the last day of a month?¿Cómo se encuentra el último día del mes?

Hasta ahora, tengo unas pocas cosas:

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

¿Hay una mejor manera?

+7

¿Alguna vez ha escrito su propio calendario? Esta es una solución fantástica en comparación. : D – Neil

+0

Simplemente mirando hacia atrás en esta publicación, ¿cómo podría ser esto un duplicado? Mi pregunta plantea una manera, y luego pregunta si hay algo mejor. El referido es solo pedir cualquier método. – Irwin

Respuesta

181

Cómo sobre el uso DaysInMonth:

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

(Nota al uno mismo - debe hacer esto fácil en Noda Time ...)

+0

@JonSkeet ¿Alguna vez has hecho esto fácil en NodaTime, o esta sigue siendo la mejor manera de hacerlo? –

+0

@BenJenkinson: Definitivamente sigue siendo la mejor manera en este momento. En 2.0 puedes usar un 'DateAdjuster' - no hay uno para' LastDayOfMonth' en este momento, pero podría agregar uno esta noche :) –

+1

@BenJenkinson: Ha - resulta que * ya * lo había hecho - 'DateAdjusters .EndOfMonth'. –

19

Usted puede utilizar el método DateTime.DaysInMonth(year,month) para obtener el número de días en un determinado mes.

1

si está interesado en una versión de código personalizado:

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 como un método:

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

o como un método de extensión:

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

En el mejor de los casos, este código devuelve el primer día del mes siguiente, no el último día del mes actual. Además, se encuentra con problemas al manejar meses con diferentes días. Si hoy fuera 1/4/2017, este código regresará el 2/1/2017. Si hoy fuera el 1/31/2017, este código regresará a 1/29/2017. –

5

He aquí un enfoque elegante que encontré en una biblioteca de extensión DateTime útil en CodePlex:

http://datetimeextensions.codeplex.com/

He aquí algunos ejemplos de código:

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

Tiene algunas otras extensiones útiles, así que pueden ser útil para ti

Cuestiones relacionadas