2009-11-25 53 views

回答

16

沒有必要運行該一個循環:

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

這可以很容易地轉換成一個擴展方法,像這樣:

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

...並然後可以使用直接來自任何DateTime對象:

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

更新:修復了一個bug。

0

你可以嘗試這樣的事情

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

或也嘗試

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

我留下它開放結束,所以你可以很容易地用一個參數換出月份。

-2

對不起

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

是錯誤的!

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