通过在c#中传递一年中的周数来获得周的第一个日期的更好方法

本文关键字:周数 第一个 方法 更好 日期 一年 | 更新日期: 2023-09-27 18:20:40

我写了下面的方法,通过传递年份和年份的周数来返回第一个星期的日期,我认为星期一是一周的第一天。我想知道是否有更好的方法可以计算这个。这是我的密码;

 public static DateTime GetFirstDateOfWeekByWeekNumber(int year, int weekNumber)
    {
        var date = new DateTime(year, 01, 01);
        var firstDayOfYear = date.DayOfWeek;
        var result = date.AddDays(weekNumber * 7);
        if (firstDayOfYear == DayOfWeek.Monday)
            return result.Date;
        if (firstDayOfYear == DayOfWeek.Tuesday)
            return result.AddDays(-1).Date;
        if (firstDayOfYear == DayOfWeek.Wednesday)
            return result.AddDays(-2).Date;
        if (firstDayOfYear == DayOfWeek.Thursday)
            return result.AddDays(-3).Date;
        if (firstDayOfYear == DayOfWeek.Friday)
            return result.AddDays(-4).Date;
        if (firstDayOfYear == DayOfWeek.Saturday)
            return result.AddDays(-5).Date;
        return result.AddDays(-6).Date;
    }

通过在c#中传递一年中的周数来获得周的第一个日期的更好方法

如果您想替换If/else构造,您可以使用底层枚举值进行计算。枚举以Sunday = 0Monday = 1开头,因此为了获得基于星期一的值,您需要将其移动一。你可以通过以下方式做到这一点:

int delta = -((int)firstDayOfYear + 6) % 7;
// and then just apply the delta
return result.AddDays(delta).Date

请注意,不要按顺序使用多个具有互斥条件的if。在您的示例中,如果星期是Monday,那么构造仍然会根据中的每个条件检查值。但是,如果使用正确的if/else if/else结构,那么它只会进行第一次检查,然后跳到最后。使用switch语句也可以避免这种情况,因为要执行的分支是在一个步骤中评估的。