2010-09-01 119 views
3

我被卡住了一段時間,現在需要你的幫助。只選擇每個月的第四個星期天

我想在一個下拉每個月只有第四個星期日顯示,說從1月 - 2010年8月31日 - 2011

我只想第四個星期日在下拉列表中,如何使用ASP來做到這一點.NET C#

問候

回答

8

下面是一個使用一個小LINQ和第四個星期日將在本月22日和28日(含)之間發生的知識的方法。

DateTime startDate = new DateTime(2010, 9, 1); 
DateTime endDate = startDate.AddYears(1).AddDays(-1); 

List<DateTime> fourthSundays = new List<DateTime>(); 

DateTime currentDate = startDate; 
while (currentDate < endDate) 
{ 
    // we know the fourth sunday will be the 22-28 
    DateTime fourthSunday = Enumerable.Range(22, 7).Select(day => new DateTime(currentDate.Year, currentDate.Month, day)).Single(date => date.DayOfWeek == DayOfWeek.Sunday); 
    fourthSundays.Add(fourthSunday); 
    currentDate = currentDate.AddMonths(1); 
} 

然後,您可以綁定該List<DateTime>到下拉或跳過贊成加入的項目,你產生他們的下拉列表中,像下面的列表本身。

yourDropdown.Items.Add(new ListItem(fourthSunday.ToString())); 

對於笑聲,你可以做整個事情的LINQ語句,並跳過(大部分)的變量。

DateTime startDate = new DateTime(2010, 9, 1); 
IEnumerable<DateTime> fourthSundays = 
    Enumerable.Range(0, 12) 
    .Select(item => startDate.AddMonths(item)) 
    .Select(currentMonth => 
     Enumerable.Range(22, 7) 
     .Select(day => new DateTime(currentMonth.Year, currentMonth.Month, day)) 
     .Single(date => date.DayOfWeek == DayOfWeek.Sunday) 
    ); 
0

安東尼的回答很好,我很喜歡。作爲替代方法,這裏有一個參數化方法,用於一週中的某一天和一週的數字(即如果您需要其他組合,例如第4個星期日,第3個星期五等)並附帶一些評論。

這樣稱呼它爲你的情況:

List<DateTime> sundays = DateInstances(new DateTime(2010, 9, 1), new DateTime(2011, 8, 31), DayOfWeek.Sunday, 4); 

而且方法本身:

public List<DateTime> DateInstances(DateTime start, DateTime end, DayOfWeek day, int weeks) 
{ 
    if (start > end) 
     throw new ArgumentOutOfRangeException("end", "The start date must occur before the end date"); 

    List<DateTime> results = new List<DateTime>(); 

    DateTime temp = start; 
    while (temp < end) 
    { 
     DateTime firstWeekday = new DateTime(temp.Year, temp.Month, 1); 

     //increment to the given day (i.e. if we want the 4th sunday, we must find the first sunday of the month) 
     while (firstWeekday.DayOfWeek != day) 
      firstWeekday = firstWeekday.AddDays(1); 

     //add the number of weeks (note: we already have the first instance, so subtract 1) 
     firstWeekday = firstWeekday.AddDays(7 * (weeks - 1)); 

     //make sure we haven't gone over to the next month 
     if (firstWeekday.Month == temp.Month) 
      results.Add(firstWeekday); 

     //let's not loop forever ;) 
     temp = temp.AddMonths(1); 
    } 

    return results; 
} 
1

厭倦所以在這裏你去。如果存在兩個輔助方法,則一個檢索周,另一個輔助方法通過月份迭代

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime startDate = new DateTime(2010, 09, 1); 
     foreach(DateTime dt in EachMonth(new DateTime(2010, 09, 1), new DateTime(2011, 09, 1))){ 
      DateTime? result = GetDayByWeekOffset(DayOfWeek.Sunday, dt, 4); 
      Console.WriteLine("Sunday:" + (result.HasValue?result.Value.ToString("MM-dd-yyyy"):"null")); 
     } 
     Console.ReadKey(); 
    } 

    public static DateTime? GetDayByWeekOffset(DayOfWeek day, DateTime month, int weekOffSet) 
    { 
     //First day of month 
     DateTime firstDayOfMonth = month.AddDays((-1 * month.Day) + 1); 

     // 
     int daysOffSet; 
     daysOffSet= ((int)day + 7 - (int)firstDayOfMonth.DayOfWeek) % 7; 
     DateTime firstDay = month.AddDays(daysOffSet); 

     // Add the number of weeks specified 
     DateTime resultDate = firstDay.AddDays((weekOffSet - 1) * 7); 

     if (resultDate.Month != firstDayOfMonth.Month){ 
      return null; 
     }else{ 
      return resultDate; 
     } 
    } 

    public static IEnumerable<DateTime> EachMonth(DateTime from, DateTime thru) 
    { 
     for (var month = from.Date; month.Date <= thru.Date; month = month.AddMonths(1)) 
      yield return month; 
    } 
} 
相關問題