计算日期范围的确切周数

Calculate exact no of week for date range

一个人在不同的时间段内从事不同的工作,从周一开始到周五结束为follows.Monday到周五算1周week.Any重叠周算1周. 以下是场景

“分配的订婚日期”:[ { “开始日期”:“01/03/2022”, “结束日期”:“01/07/2022” }, { “开始日期”:“01/10/2022”, “结束日期”:“01/14/2022” }, { “开始日期”:“01/10/2022”, “结束日期”:“01/21/2022” }, { “开始日期”:“02/14/2022”, “结束日期”:“02/18/2022” }

]

在这里我需要找到这个人分配的周数,它应该是 4,因为从 1 月 10 日到 2 月 14 日的一周在 2 个参与中重叠。

我如何使用 linq 在 C# 中执行此操作。我试图从列表中获取最小开始日期和最大结束日期并找到差异并在数周内进行转换,但自分配日期以来它没有给出实际结果不一致。

诀窍是将每个日期范围转换为枚举的周范围,或者至少是对应于每周或部分周的不同日期(例如星期日)的列表。 SelectMany() 可让您将它们全部收集在一起,之后不同的计数会为您提供答案。

试试这样的东西:

int numberOfWeeks = AssignedEngagementdate
    .SelectMany(a => {
        DateTime firstSunday = a.Startdate.AddDays(-(int)a.Startdate.DayOfWeek);
        DateTime lastSunday = a.Enddate.AddDays(-(int)a.Enddate.DayOfWeek); // May be same as firstSunday
        int weeks = (lastSunday - firstSunday).Days / 7 + 1;

        // Enumerate one Sunday per week
        return Enumerable.Range(0, weeks).Select(i => firstSunday.AddDays(7 * i));
    })
    .Distinct()
    .Count();

您可能仍需要考虑和测试作业在星期一和星期五以外的日子开始或结束的情况。以上应该可以处理大多数此类情况。

没有 linq,你可以试试这个日期时间扩展:

        public static int NumberOfWeeksBetween(this DateTime start, DateTime end)
        {
            TimeSpan span = end.Subtract(start);
            if (span.Days <= 7)
            {
                if (start.DayOfWeek > end.DayOfWeek) return 2;
                else return 1;
            }

            int days = span.Days - 7 + (int)start.DayOfWeek;
            int weekCount = 1;
            int dayCount = 0;

            for (weekCount = 1; dayCount < days; weekCount++) dayCount += 7;

            return weekCount;
        }