2013-01-17 46 views
2

我有一個表單接受「月」和「年」的輸入,我在這裏寫作詢問關於如何獲得所有「工作周」的任何想法?ASP.NET獲得每個月的工作周

我的意思是「工作周的週一 - 週五

所以基本上我需要week1到week4如果可用,包括week5。

例如,如果我輸入2013年1月:

week1 = January 1 to January 4 
week2 = January 7 to January 11 
week3 = January 14 to January 18 
week4 = January 21 to January 25 
week5 = January 28 to January 31 

我怎樣才能做到這一點?謝謝你的幫助!任何建議或想法將不勝感激。謝謝配偶! :)

+0

哪個版本。你使用的是網絡嗎? – Anicho

+0

我使用.net 2.0,因爲我創建的單個頁面將被上傳到sharepoint,而且sharepoint只支持2.0 :( – jomsk1e

+0

所以會發生什麼是某人輸入一個月和一年,然後用戶得到所有標準的輸出 – Anicho

回答

4

您可以使用此Linq查詢:

int month = 1; 
int year = 2013; 
var cal = System.Globalization.CultureInfo.CurrentCulture.Calendar; 
IEnumerable<int> daysInMonth = Enumerable.Range(1, cal.GetDaysInMonth(year, month)); 

List<Tuple<int, DateTime, DateTime>> listOfWorkWeeks = daysInMonth 
    .Select(day => new DateTime(year, month, day)) 
    .GroupBy(d => cal.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)) 
    .Select(g => Tuple.Create(g.Key, g.First(), g.Last(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday))) 
    .ToList(); 

// Item1 = week in year, Item2 = first day, Item3 = last working day 
int weekNum = 1; 
foreach (var weekGroup in listOfWorkWeeks) 
{ 
    Console.WriteLine("Week{0} = {1} {2} to {1} {3}" 
     , weekNum++ 
     , System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(month) 
     , weekGroup.Item2.Day 
     , weekGroup.Item3.Day); 
} 

輸出爲1月:

Week1 = January 1 to January 4 
Week2 = January 7 to January 11 
Week3 = January 14 to January 18 
Week4 = January 21 to January 25 
Week5 = January 28 to January 31 

而2月:

Week1 = February 1 to February 1 
Week2 = February 4 to February 8 
Week3 = February 11 to February 15 
Week4 = February 18 to February 22 
Week5 = February 25 to February 28 
+0

名稱'CalendarWeekRule'在當前內容中不存在。 :( – jomsk1e

+0

爲'System.Globalization'增加一個使用 – Arran

+1

感謝這!節省我的一天!LINQ真的很棒!! – jomsk1e

0

找到月份和年份的第一個星期一。

int year = 2013; 
int month = 1; 

DateTime testDate = new DateTime(year,month,1); 


while (testDate.DayOfWeek != DayOfWeek.Monday) 
{ 
    testDate = testDate.AddDays(1); 
} 

然後每星期超過迭代,直到你達到一年,是不是2013年

// Should have first monday now. 
// Loop until the month changes 
while (testDate.Month == month) 
{ 
    var monday = testDate; 
    var friday = testDate.AddDays(4); 

    // You now have both dates. Do whatever you need to. 
    // here. 

    // Increment test date by a week 
    testDate = testDate.AddDays(7) 
} 
+2

這是一個可怕的解決方案 - 循環是瘋狂 –

+3

@Dave Bish - 提出一個更好的答案,我們都是科學家,我喜歡看到改進 –

+0

@jgauffin - 取決於用戶想如何滾動這些年份2012年52周是2012年的最後一週或2013年的第一週。 –

0

在僞代碼:

  1. 從本月的第一天開始
  2. while(day!= Monday)take next date(+1 day)

    請參閱this SO post(Jon Skeet answer!)檢查一天是否是星期一。

  3. 添加4天找到工作周

    結束時,如果它是在同一個月,比你有一個工作周你的答案。

  4. 加入7天,尋找下一個週一

  5. 如果新週一仍然是相同的一個月內:重複3和4

編輯上面找到所有完整工作周。

尋找另一週還有:

  • 如果該月的第一天,已經是一個工作日,找到下週五。 - >第一個工作周
  • 如果最後一個星期五在下個月,則在該月的最後一天結束最後一個工作周。 - >最後一個工作周