【问题标题】:Calculate exact no of week for date range计算日期范围的确切周数
【发布时间】:2022-01-07 07:33:17
【问题描述】:

一个人在不同的时间段内从事不同的工作,从星期一开始,到星期五结束,如下所示。周一至周五将被视为1周。任何重叠的周被视为1周。 下面是场景

“分配的订婚日期”:[ { "开始日期":"01/03/2022", “结束日期”:“2022 年 1 月 7 日” }, { "开始日期":"01/10/2022", “结束日期”:“2022 年 1 月 14 日” }, { "开始日期":"01/10/2022", “结束日期”:“2022 年 1 月 21 日” }, { "开始日期":"02/14/2022", “结束日期”:“2022 年 2 月 18 日” }

]

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

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

【问题讨论】:

  • SO 不是编码服务 - 请展示你的努力

标签: c# linq c#-4.0


【解决方案1】:

诀窍是将每个日期范围转换为枚举的周范围,或者至少是对应于每周或部分周的不同日期(例如星期日)的列表。 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();

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

【讨论】:

  • 非常感谢你..似乎它对我有用。因为我的情况开始日期总是星期一,结束日期总是星期五。你能详细解释一下你的逻辑吗?
  • @shashankshekhar - 首先请注意,我对 lastSunday 的计算进行了更正。有一个对 Startdate.DayOfWeek 的引用,它应该是 Enddate.DayOfWeek。对于任何给定的日期,DayOfWeek 返回从星期日 (0) 到星期六 (6) 的枚举。从原始日期中减去该天数得出该周的星期日日期。对于一周的任务,两个星期日相同,天数差为 0,计算的周数为 1。对于多周任务,日期差是 7 的倍数。除以 7 加 1 得到数字数周。
  • (续)对于给定的周数 N,Enumerable.Range 产生一个从 0 到 (N-1) 的序列。接下来的计算计算与分配对应的 N 个星期日日期的范围,包括第一周和最后一周之间的任何中间星期日。这些日期被反馈给 SelectMany 函数,该函数将它们收集在一起。 Distinct 消除了由于重叠分配而导致的任何重复,最后 Count 就如它所说的那样。
【解决方案2】:

没有 linq,你可以试试这个 Datetime 扩展:

        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;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多