首页 > 解决方案 > 查找日期范围之间的差距

问题描述

我需要你的帮助。我试图弄清楚如何找到 EndDate 和下一个 StartDate 之间的差距。如果有差距,我需要返回差距所在的值。你能帮我么?

我有一个包含 StartDate 和 Enddate 的列表。例子:

  1. 开始日期:2/01/2021 结束日期:2/10/2021
  2. 开始日期:2/11/2021结束日期:2/15/2021
  3. 开始日期:2/20/2021结束日期:2/25/2021

1和2之间没有差距。2 (Enddate) 和 3 (Stardate) 之间是一个 Gap,需要返回如下结果:Gap found between 2/16/2021 和 2/19/2021。

我已经尝试过这个,但对我来说效果不佳,你们中的哪位可以在这里帮助我吗?

static void Main(string[] args)
    {
        List<DateRanges> DateRanges = new List<DateRanges>();
        DateRanges.Add(new DateRanges() { StartDate = new DateTime(2021, 01, 01), EndDate = new DateTime(2021, 01, 31) });
        DateRanges.Add(new DateRanges() { StartDate = new DateTime(2021, 02, 10), EndDate = new DateTime(2021, 02, 25) });

        var missing = DateRangeEnumerable.GetDates(DateRanges);
        var ranges = missing.GetRanges();
    }


public class DateRanges
{
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    //public DateRanges(DateTime Start, DateTime End)
    //{
    //    StartDate = Start;
    //    EndDate = End;
    //}
}


public static class DateRangeEnumerable
{
    public static IEnumerable<DateTime> GetDates(this IEnumerable<DateRanges> source)
    {
        var sortedSource = source.OrderBy(r => r.StartDate);

        foreach (var range in sortedSource)
        {
            var d = range.StartDate;
            while (d < range.EndDate)
            {
                yield return d;
                d = d.AddDays(1);
            }
        }
    }
    public static IEnumerable<DateRanges> GetRanges(this IEnumerable<DateTime> source)
    {
        var sortedSource = source.OrderBy(d => d);
        var enumerator = sortedSource.GetEnumerator();

        if (!enumerator.MoveNext())
            yield break;

        DateTime from = enumerator.Current;
        DateTime prev = from;

        while (true)
        {
            while (true)
            {
                if (enumerator.MoveNext())
                {
                    if (enumerator.Current == prev.AddDays(1))
                        prev = enumerator.Current;
                    else
                        break;
                }
                else
                {
                    yield return new DateRanges() { StartDate = from, EndDate = prev.AddDays(1) };
                    yield break;
                }

            }

            yield return new DateRanges() { StartDate = from, EndDate = prev.AddDays(1) };

            from = enumerator.Current;
            prev = enumerator.Current;
        }
    }
}

标签: c#.netlinqdatetime

解决方案


示例

var dateRanges = new List<DateRanges>
{
   new() {StartDate = new DateTime(2021, 2, 01), EndDate = new DateTime(2021, 2, 10)},
   new() {StartDate = new DateTime(2021, 02, 11), EndDate = new DateTime(2021, 02, 15)},
   new() {StartDate = new DateTime(2021, 02, 20), EndDate = new DateTime(2021, 02, 25)}
};

var end = dateRanges.First().EndDate;
foreach (var range in dateRanges.Skip(1))
{
   if(end.AddDays(1) <  range.StartDate )
      Console.WriteLine($"{end.AddDays(1):d} - {range.StartDate.AddDays(-1):d}");
   end = range.EndDate;
}

输出

16/02/2021 - 19/02/2021

免责声明:这不包含错误检查,不排序,代码中没有任何暗示,并假设日期没有时间价值。它只是复制您的描述


推荐阅读