2013-06-12 25 views
0

如何獲得dates在給定月份和年份的特定一週?如何根據月份和年份獲得特定一週中的日期集合?

例如:

我的參數:

June - 2013 - The second week 

我想要的結果集是這樣的:

9-6-2013 
10-6-2013 
11-6-2013 
12-6-2013 
13-6-2013 

我想從太陽開始星期四

+1

你是如何定義 「周」?總是從第8開始?總是從星期六開始? ISO術語中的星期幾? –

+0

我希望它從星期天到星期三開始,在我的例子中是第二週 –

+1

那麼編寫代碼的問題到底是什麼?搞清楚某一天的某一天是哪一天?查找給定月份的第一天?增加天數直到你找到符合你的標準的第一天?數到7? –

回答

7
在我 Noda Time庫我會

好:

  • 從的末尾開始上個月
  • 無限次循環尋找下一個星期日
  • 從那裏開始,產生日子(所以你可以只是你知的foreach環路):

所以:

IEnumerable<LocalDate> GetSundayToWednesday(int year, int month, int week) 
{ 
    LocalDate date = new LocalDate(year, month, 1).PlusDays(-1);   
    for (int i = 0; i < week; i++) 
    { 
     date = date.Next(IsoDayOfWeek.Sunday); 
    } 
    // You always want 4 days, Sunday to Wednesday 
    for (int i = 0; i < 4; i++) 
    { 
     yield return date; 
     date = date.PlusDays(1); 
    } 
} 

只需使用DateTime,我可能會開始在每月的第一天,它可能是(周* 7 + 1)和循環,直到我打了一週的天權,然後再從那裏:

IEnumerable<DateTime> GetSundayToWednesday(int year, int month, int week) 
{ 
    // Consider breaking this part out into a separate method? 
    DateTime date = new DateTime(year, month, week * 7 + 1); 
    for (int i = 0; i < 7; i++) 
    { 
     if (date.DayOfWeek == DayOfWeek.Sunday) 
     { 
      break; 
     } 
     date = date.AddDays(1); 
    } 
    // You always want 4 days, Sunday to Wednesday 
    for (int i = 0; i < 4; i++) 
    { 
     yield return date; 
     date = date.AddDays(1); 
    } 
} 

循環這樣是不是非常高效的 - 你可以只工作了多少天來推進 - 但更明顯的是。使用更有效的方法很容易導致逐個錯誤(或回到上個月)。當然,如果這很重要,你可以選擇更加努力地提高效率。

+0

我只是想說,StackOverflow先生在野田時間工作,他會推薦它! :-) –

1

我還沒有真正測試了這一點,但我認爲這確實或多或少你想要什麼:

 int year = 2013; 
     int month = 6; 
     int lookupWeek = 2; 

     int daysInMonth = DateTime.DaysInMonth(year, month); 
     int weekCounter = 1; 

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

     for (int day = 1; day <= daysInMonth; day++) 
     { 
      DateTime date = new DateTime(year,month,day); 
      if(date.DayOfWeek == DayOfWeek.Sunday && day > 1) weekCounter++; 

      if(weekCounter == lookupWeek) weekDays.Add(date); 
     } 
+1

用更清晰的變量名稱更新了幾次,並修正了星期編號。 –

1

這種方法使天在一個月的特定星期:

static IEnumerable<string> DaysInWeek(int year, int month, int week) 
{ 
    var date = new DateTime(year, month, 1); 

    var calendar = new GregorianCalendar(); 
    var firstWeek = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday); 
    var days = calendar.GetDaysInMonth(year, month); 

    var daysInWeek = (from day in Enumerable.Range(0, calendar.GetDaysInMonth(year, month) - 1) 
         let dayDate = date.AddDays(day) 
         let week2 = calendar.GetWeekOfYear(dayDate, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday) - firstWeek + 1 
         where week2 == week 
         select day + 1).ToList(); 

    foreach (var d in daysInWeek) yield return string.Format("{0:00}-{1:00}-{2:0000}", d, month, year); 
} 

並在此輸出:

foreach (var d in DaysInWeek(week, year, month).Take(5)) Log.Info(d); 

是:

09-06-2013 
10-06-2013 
11-06-2013 
12-06-2013 
13-06-2013 

注:我編輯了代碼。有一個小錯誤;因爲在很多個月中,第一週和上週都不是完整的周,而那一週的某些日子屬於另一個月。

1

如果你有興趣的客戶端(JavaScript)的路線,然後date.js可能是值得一看,它允許以下:

// What date is next thursday? 
Date.today().next().thursday(); 

// Add 3 days to Today 
Date.today().add(3).days(); 

// Is today Friday? 
Date.today().is().friday(); 

// Number fun 
(3).days().ago(); 

// 6 months from now 
var n = 6; 
n.months().fromNow(); 

// Set to 8:30 AM on the 15th day of the month 
Date.today().set({ day: 15, hour: 8, minute: 30 }); 

// Convert text into Date 
Date.parse('today'); 
Date.parse('t + 5 d'); // today + 5 days 
Date.parse('next thursday'); 
Date.parse('February 20th 1973'); 
Date.parse('Thu, 1 July 2004 22:30:00'); 

我找到自然語言的語法(即「下週四')相當強大。

0

試試這個

protected void button_click(object sender, EventArgs e) 
    { 
     DateTime dt = new DateTime(2013, 6, 1); 
     string[] dates = getDates(dt); 

    } 
     public string[] getDates(DateTime dt) 
    { 
     string[] result = new string[7]; ; 
     for (int i = getDay(dt.DayOfWeek.ToString()); i < 7; i++) 
     { 
      if (i == 0) 
      { 
       break; 
      } 
      else 
      { 
       dt = dt.AddDays(1); 
      } 
     } 
     for (int i = 0; i < 7; i++) 
     { 
      dt = dt.AddDays(1); 
      result[i] = dt.ToShortDateString(); 
     } 
     return result; 
    } 
    public int getDay(string day) 
    { 
     switch (day) 
     { 
      case "Monday": 
       return 0; 
      case "Tuesday": 
       return 1; 
      case "Wednesday": 
       return 2; 
      case "Thursday": 
       return 3; 
      case "Friday": 
       return 4; 
      case "Saturday": 
       return 5; 
      case "Sunday": 
       return 6; 
      default: 
       return 0; 
     } 
    }## Heading ## 
+0

-1:「試試這個」沒有**任何**評論是不是一個好的格式在SO上的答案。 –

1

如果你熱衷於使用LINQ(我幾乎總是在這裏!),你可以這樣做:

int year = 2013; 
int month = 6; 
int weekOfMonth = 2; 

var dates = Enumerable.Range(1, DateTime.DaysInMonth(year, month)) 
        .Select(day => new DateTime(year, month, day)) 
        .GroupBy(g=> g.DayOfYear/7) 
        .ToList(); 

var week = dates.Min(g => g.Key) + weekOfMonth - 1; 
var result = dates.Where(g=> g.Key.Equals(week)).Select(g => g.ToList()); 
相關問題