2009-11-25 15 views

Respuesta

16

No hay necesidad de ejecutar un bucle para esto:

private static DateTime GetLastWeekdayOfMonth(DateTime date, DayOfWeek day) 
{ 
    DateTime lastDayOfMonth = new DateTime(date.Year, date.Month, 1) 
     .AddMonths(1).AddDays(-1); 
    int wantedDay = (int)day; 
    int lastDay = (int)lastDayOfMonth.DayOfWeek; 
    return lastDayOfMonth.AddDays(
     lastDay >= wantedDay ? wantedDay - lastDay : wantedDay - lastDay - 7); 
} 

Esto se puede convertir fácilmente en un método de extensión, así:

public static class DateTimeExtensions 
{ 
    public static DateTime GetLastWeekdayOfMonth(this DateTime date, DayOfWeek day) 
    { 
     DateTime lastDayOfMonth = new DateTime(date.Year, date.Month, 1) 
      .AddMonths(1).AddDays(-1); 
     int wantedDay = (int)day; 
     int lastDay = (int)lastDayOfMonth.DayOfWeek; 
     return lastDayOfMonth.AddDays(
      lastDay >= wantedDay ? wantedDay - lastDay : wantedDay - lastDay - 7); 
    } 
} 

... y luego se puede utilizar directamente desde cualquier objeto DateTime:

DayOfWeek lastSunday = DateTime.Now.GetLastWeekdayOfMonth(DayOfWeek.Sunday); 

Actualización: se ha corregido un error.

0

Usted puede intentar algo como esto

DateTime date = new DateTime(2009, 10, 01); 
date = date.AddMonths(1).AddDays(-1); 
while (date.DayOfWeek != DayOfWeek.Sunday) date = date.AddDays(-1); 

o también tratar

date = date.AddDays(-(int)date.DayOfWeek); 
0
DateTime current = new DateTime(DateTime.Today.Year, 
    10, DateTime.DaysInMonth(DateTime.Today.Year, 10)); 

while (current.DayOfWeek != DayOfWeek.Sunday) 
{ 
    current = current.AddDays(-1); 
} 

Console.WriteLine(current.ToLongDateString()); 

I lo dejó abierto para que pueda cambiar el mes con un parámetro con bastante facilidad.

-2

Lo sentimos

DateTime lastDayOfMonth = new DateTime(date.Year, date.Month, 1) 
     .AddMonths(1).AddDays(-1); 

es un error!

=> DateTime lastDayOfMonth = new DateTime(aYear, aMonth, DateTime.DaysInMonth(aYear, aMonth)); 
Cuestiones relacionadas