2009-11-25 9 views

Odpowiedz

16

Nie ma potrzeby, aby uruchomić pętlę dla tego:

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

ten można łatwo przekształcić metodę rozszerzenia, tak:

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

... i mogą być następnie wykorzystane bezpośrednio z dowolnego obiektu DateTime:

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

Aktualizacja: poprawiono błąd.

0

You można spróbować czegoś jak ten

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

lub też spróbować

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 pozostawił otwarty, dzięki czemu można łatwo wymienić miesiąc z parametrem.

-2

Niestety

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

jest błędne!

=> DateTime lastDayOfMonth = new DateTime(aYear, aMonth, DateTime.DaysInMonth(aYear, aMonth)); 
Powiązane problemy