C#从日期列表中计算日期范围

时间:2010-05-08 16:50:01

标签: c# date

鉴于日期列表(可能没有排序),我想建立一个日期范围列表 -

E.g。假设MM / DD格式,

输入 - 5/1, 5/5, 5/6, 5/15, 5/7, 5/8, 5/19,5/20, 5/23

输出 -

Date Range 1: 5/1 to 5/1
Date Range 2: 5/5 to 5/8
Date Range 3: 5/15 to 5/15
Date Range 4: 5/19 to 5/20
Date Range 5: 5/23 to 5/23

基本上,范围应该是连续的。

3 个答案:

答案 0 :(得分:5)

  1. 排序日期
  2. 开始一个包含下一个日期的范围(从它开始将是第一个日期)
  3. 第二个“有效”日期是该范围内的下一个日期吗?如果是这样,继续前进。如果没有,请关闭当前范围并开始新的范围。
  4. 重复直到你的约会用完为止,此时你关闭当前范围就完成了。

答案 1 :(得分:0)

您可以创建DateTime的列表(可能对所有人使用相同年份)并对其进行排序。

然后很容易找到列表中是否存在一天和第二天(使用DateTime.AddDays(1))。

答案 2 :(得分:0)

public class DateRange
{
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

[TestClass]
public class DateRangerTest
{

    private List<DateRange> GetDateRanges(List<DateTime> dates)
    {
        if (dates == null || !dates.Any()) return null;
        dates = dates.OrderBy(x => x.Date).ToList();

        var dateRangeList = new List<DateRange>();

        DateRange dateRange = null;
        for (var i = 0; i < dates.Count; i++)
        {
            if (dateRange == null)
            {
                dateRange = new DateRange { Start = dates[i] };
            }
            if (i == dates.Count - 1 || dates[i].Date.AddDays(1) != dates[i + 1].Date)
            {
                dateRange.End = dates[i].Date;
                dateRangeList.Add(dateRange);
                dateRange = null;
            }
        }
        return dateRangeList;
    }

    [TestMethod]
    public void GetDateRanges_MultiDateRangeTest()
    {
        var dates = new List<DateTime>
        {
            new DateTime(1999,5,1),
            new DateTime(1999,5,5),
            new DateTime(1999,5,6),
            new DateTime(1999,5,15),
            new DateTime(1999,5,7),
            new DateTime(1999,5,8),
            new DateTime(1999,5,19),
            new DateTime(1999,5,20),
            new DateTime(1999,5,23)
        };

        var dateRanges = GetDateRanges(dates);

        Assert.AreEqual(new DateTime(1999, 5, 1), dateRanges[0].Start);
        Assert.AreEqual(new DateTime(1999, 5, 1), dateRanges[0].End);

        Assert.AreEqual(new DateTime(1999, 5, 5), dateRanges[1].Start);
        Assert.AreEqual(new DateTime(1999, 5, 8), dateRanges[1].End);

        Assert.AreEqual(new DateTime(1999, 5, 15), dateRanges[2].Start);
        Assert.AreEqual(new DateTime(1999, 5, 15), dateRanges[2].End);

        Assert.AreEqual(new DateTime(1999, 5, 19), dateRanges[3].Start);
        Assert.AreEqual(new DateTime(1999, 5, 20), dateRanges[3].End);

        Assert.AreEqual(new DateTime(1999, 5, 23), dateRanges[4].Start);
        Assert.AreEqual(new DateTime(1999, 5, 23), dateRanges[4].End);
    }
}