You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取指定年份周列表(含起止日期)的跨年度问题修复需求

获取指定年份无跨年度的周列表及起止日期

原方案存在的问题

需求是获取指定年份的周列表,要求任何周的起止日期都不能跨年度:例如若新年从周四开始,上一年最后一周截止到周三,新一年第一周从周四开始。

最初参考的代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:12:57