2017-05-06 65 views
0

問候我有低於這個型號:創建一年內周的列表

public class WeekOfYear 
    { 
     public int WeekNumber { get; set; } 
     public DateTime FirstDayOfWeek { get; set; } 
     public DateTime LastDayOfWeek { get; set; } 
    } 

目前,我試圖創建基於一年的周列表,我必須知道哪一週是我本週的第一天和最後一天是什麼,我已經研究了一下,但沒有出現,我知道如何獲得WeekNumber,但是當我嘗試獲得其他屬性時,問題就開始了「第一/最後幾天這周「,任何人都有任何線索?它的讚賞。

更新

讓我更清楚,可以說,我知道我是一年的第一個星期內,我想知道的是一週的第一天是例如:星期一2017年-1-1,最後一天是2017-1-7週日。

+1

「星期的第一天」是文化特定的。關於這個問題有很多有用的問題,比如[this](http://stackoverflow.com/questions/38039/how-我可以得到這個星期的開始日期) – stuartd

+0

@stuartd謝謝,我會看看 – Valkyrie

+0

請參閱'CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek'。 –

回答

2

我之前做過類似的事情。我已將我的代碼改編爲您的課程,看看它是否有幫助:

public static List<WeekOfYear> GetWeeksOfYear(int year) 
{ 
    var weeksQuantity = GetNumberOfWeeksInYear(year); 
    var weeksList = new List<WeekOfYear>(); 

    for (int i = 1; i <= weeksQuantity; i++) 
    { 
     var weekNumber = i; 

     DateTime firstDay; 
     DateTime lastDay; 
     GetFirstAndLastDateOfWeek(year, weekNumber, out firstDay, out lasDay); 

     weeksList.Add(new WeekOfYear 
     { 
      FirstDayOfWeek = firstDay, 
      LastDayOfWeek = lastDay, 
      WeekNumber = weekNumber 
     }); 
    } 

    return weeksList; 
} 

public static int GetNumberOfWeeksInYear(int year) 
{ 
    var dfi = DateTimeFormatInfo.CurrentInfo; 
    var date1 = new DateTime(year, 12, 31); 
    if (dfi != null) 
    { 
     Calendar cal = dfi.Calendar; 
     return cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, 
      dfi.FirstDayOfWeek); 
    } 

    return 0; 
} 

public static void GetFirstAndLastDateOfWeek(int year, int weekOfYear, out DateTime firstDay, out DateTime lastDay) 
{ 
    var ci = CultureInfo.CurrentCulture; 

    DateTime jan1 = new DateTime(year, 1, 1); 
    int daysOffset = (int)ci.DateTimeFormat.FirstDayOfWeek - (int)jan1.DayOfWeek; 
    DateTime firstWeekDay = jan1.AddDays(daysOffset); 
    int firstWeek = ci.Calendar.GetWeekOfYear(jan1, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek); 
    if ((firstWeek <= 1 || firstWeek >= 52) && daysOffset >= -3) 
    { 
     weekOfYear -= 1; 
    } 

    firstDay = firstWeekDay.AddDays(weekOfYear * 7); 
    lastDay = firstDay.AddDays(6); 
} 
0

此代碼可能會給您一些幫助;

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach(var week in 2017.GenerateWeekSequence()) 
     { 
      Console.WriteLine($"Week ({week.WeekNumber}. First day={week.FirstDayOfWeek.ToString()}, Last day={week.LastDayOfWeek.ToString()}"); 
     } 
    } 
} 

public static class WeekExtensions 
{ 
    private static CultureInfo ThreadCulture => Thread.CurrentThread.CurrentCulture; 
    public class Info 
    { 
     public Info(DateTime firstDayOfWeek) { FirstDayOfWeek = firstDayOfWeek; } 

     public int WeekNumber => ThreadCulture.Calendar.GetWeekOfYear(
      FirstDayOfWeek, CalendarWeekRule.FirstDay, ThreadCulture.DateTimeFormat.FirstDayOfWeek); 

     public DateTime FirstDayOfWeek { get; } 

     public DateTime LastDayOfWeek => FirstDayOfWeek.AddDays(6); 
    } 

    public static IEnumerable<Info> GenerateWeekSequence(this int year) 
    { 
     var runner = new DateTime(year, 1, 1); 
     // Move back to the first day of week (even if it's in the previous year) 
     while (runner.DayOfWeek != ThreadCulture.DateTimeFormat.FirstDayOfWeek) 
     { 
      runner = runner.AddDays(-1); 
     } 
     // Now, jump dates one week at a time 
     while (runner.Year <= year) 
     { 
      yield return new Info(runner); 
      runner = runner.AddDays(7); // Jump to first day of next week 
     } 
    } 
}