获取指定年份周列表(含起止日期)的跨年度问题修复需求
获取指定年份无跨年度的周列表及起止日期
原方案存在的问题
需求是获取指定年份的周列表,要求任何周的起止日期都不能跨年度:例如若新年从周四开始,上一年最后一周截止到周三,新一年第一周从周四开始。
最初参考的代码如下:
var jan1 = new DateTime(DateTime.Today.Year , 1, 1); //beware different cultures, see other answers var startOfFirstWeek = jan1.AddDays(1 - (int)(jan1.DayOfWeek)); var weeks= Enumerable .Range(0,54) .Select(i => new { weekStart = startOfFirstWeek.AddDays(i * 7) }) .TakeWhile(x => x.weekStart.Year <= jan1.Year) .Select(x => new { x.weekStart, weekFinish=x.weekStart.AddDays(4) }) .SkipWhile(x => x.weekFinish < jan1.AddDays(1) ) .Select((x,i) => new { x.weekStart, x.weekFinish, weekNum=i+1 });
该代码在2023年能正常返回周列表,但针对2020年时,第一周起始日期属于2019年,最后一周结束日期属于2021年,不符合无跨年度的要求。
自行尝试的方案及问题
为解决跨年度问题,修改后的代码如下:
var jan1 = new DateTime(year, 1, 1); var dec31 = new DateTime(year, 12, 31); CultureInfo cultInfo = CultureInfo.CurrentCulture; var startOfFirstWeek = jan1.AddDays(0 - (int)(jan1.DayOfWeek)); return Enumerable.Range(0, 54) .Select(i => new Week { StartDate = i == 0 ? jan1 : startOfFirstWeek.AddDays(i * 7), EndDate = startOfFirstWeek.AddDays(i * 7 + 7).Year == year ? startOfFirstWeek.AddDays(i * 7 + 7) : dec31, Number = i + 1 }) .TakeWhile(week => week.StartDate.Year == year) .ToList();
这段代码能正确获取第一周的起止日期,但存在第二周起始日期与第一周结束日期重合的问题。
求助需求
希望得到解决起止日期重合问题的方案,同时保持周列表的格式不变。
内容的提问来源于stack exchange,提问作者Alina Anjum
相关产品推荐
相关产品推荐

