检查多个干扰日期时间

时间:2016-07-27 05:56:14

标签: c# winforms datetime

我有一个包含StartDate和EndDate的DateTime列表, 用户应从此列表中选择一个或多个TimeSpans。 他们也有一个结构类命名课程。

如何检查是否有重叠

例如,我得到了这个

    Start Date   End Date
#1  7/20/2016    7/27/2016 Selected
#2  6/18/2016    7/25/2016 Selected
#3  7/20/2016    7/27/2016
#4  6/5/2016     6/10/2016

在此示例中,用户选择了2个包含重叠的日期。

我想用消息框或一些使用C#警告用户。

任何意见

由于

4 个答案:

答案 0 :(得分:1)

好的,首先创建一个类TimePeriod,如下所示:

public class TimePeriod
{
    public int Id;
    public DateTime FromDate
    {
        get; set;
    }

    public DateTime ToDate
    {
        get; set;
    }

    public static DateTime Parse(string date)
    {
        var dt = DateTime.Parse(date,
        CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.RoundtripKind);
        return dt;
    }
}

然后创建了一个包含此类项目的List:

List<TimePeriod> list = new List<TimePeriod>();

然后添加了您的日期示例(添加所有日期,根据您的需要添加选定的日期):

list.Add(new TimePeriod() { Id = 1, FromDate = TimePeriod.Parse("7/20/2016"), ToDate = TimePeriod.Parse("7/27/2016") });
list.Add(new TimePeriod() { Id = 2, FromDate = TimePeriod.Parse("6/18/2016"), ToDate = TimePeriod.Parse("7/25/2016") });
list.Add(new TimePeriod() { Id = 3, FromDate = TimePeriod.Parse("7/20/2016"), ToDate = TimePeriod.Parse("7/27/2016") });
list.Add(new TimePeriod() { Id = 4, FromDate = TimePeriod.Parse("6/5/2016"), ToDate = TimePeriod.Parse("6/10/2016") });

最后检查LINQ是否重叠:

var overlaps = from current in list
                from compare in list
                where
                (
                (compare.FromDate > current.FromDate &&
                compare.FromDate < current.ToDate) ||
                (compare.ToDate > current.FromDate &&
                compare.ToDate < current.ToDate)
                )
                select new
                {
                    Id1 = current.Id,
                    Id2 = compare.Id,
                };

在这种情况下,结果将是1/2&amp; 2/1和2/3&amp; 3/2。在你的情况下,它将是1/2&amp; 2/1。

答案 1 :(得分:1)

有一个非常好的库可用于处理时间段及其在nuget上的交集。

Time Period Library

还有一篇关于代码项目的文章。 Time Period Library for .NET

答案 2 :(得分:1)

您需要存储哪些日期已被选中,以及它们是否出现在多个选项中?

将每个选定时间跨度的开始和结束存储到元组selectedTimeSpans

然后:

List<int> useddays =new List<int>();
foreach (Tuple<DateTime, DateTime> selected in selectedTimeSpans)
{
    DateTime start = selected.Value1;
    DateTime end = selected.Value2;
    DateTime current = start;
    while(current <=end)
    {
        if(useddays.Contains((current-DateTime.MinValue).TotalDays)
            MessageBox. Show("Already used!");
        else
             useddays.Add((current-DateTime.MinValue).TotalDays);
        current.AddDays(1);
    }
}

答案 3 :(得分:0)

感谢所有@ c0d3b34n和@ThomasVoß,

另见本文https://stackoverflow.com/a/325964/3970128

这就是我所做的一切

好的,首先创建一个类TimePeriod,如下所示:

公共类TimePeriod {     public int Id;     public DateTime FromDate     {         得到;组;     }

public DateTime ToDate
{
    get; set;
}

public static DateTime Parse(string date)
{
    var dt = DateTime.Parse(date,
    CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.RoundtripKind);
    return dt;
}

} 然后创建一个包含此类项目的List:

List<TimePeriod> list = new List<TimePeriod>();

然后添加了您的日期示例(添加所有日期,根据您的需要添加选定的日期):

list.Add(new TimePeriod() { Id = 1, FromDate = TimePeriod.Parse("7/20/2016"), ToDate = TimePeriod.Parse("7/27/2016") });
list.Add(new TimePeriod() { Id = 2, FromDate = TimePeriod.Parse("6/18/2016"), ToDate = TimePeriod.Parse("7/25/2016") });
list.Add(new TimePeriod() { Id = 3, FromDate = TimePeriod.Parse("7/20/2016"), ToDate = TimePeriod.Parse("7/27/2016") });
list.Add(new TimePeriod() { Id = 4, FromDate = TimePeriod.Parse("6/5/2016"), ToDate = TimePeriod.Parse("6/10/2016") });

然后

        foreach (var variable in list)
        {
            foreach (var VARIABLE in list)
            {
                if (variable.Id == VARIABLE.Id)
                {
                    continue;
                }
                if ((variable.FromDate <= VARIABLE.ToDate) && (variable.ToDate >= VARIABLE.FromDate))
                {
                    Console.WriteLine("Problem Hapendes!! {0} <= {1} , {2}  >= {3}", variable.FromDate.ToString(), VARIABLE.ToDate.ToString(), VARIABLE.ToDate.ToString(), VARIABLE.FromDate.ToString());
                }
            }
        }