2017-05-06 89 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 
     } 
    } 
}