计算重叠日期

时间:2014-03-30 07:04:45

标签: c# datetime

我有一系列事件日期,包括以下内容:

class EventDate
{
    DateTime startDate;  // the date when the event starts
    int lengthInHours;   // how many hours the event will run for
}

当要添加新的时,我需要检查以确保事件不会与集合中的任何现有事件重叠。

执行此检查的优雅方法是什么?

2 个答案:

答案 0 :(得分:2)

试试这个方法:

class EventDate
{
    DateTime startDate;  // the date when the event starts
    int lengthInHours;   // how many hours the event will run for

    public bool Overlaps(EventDate otherDate)
    {
        double hours = (otherDate.startDate - startDate).TotalHours;
        return (hours >= 0 && hours <= lengthInHours) ||
               (hours < 0 && -hours <= otherDate.lengthInHours);
    }
}

收集用法:

bool isOverlapped = collection.Any(date => date.Overlaps(newDate));

答案 1 :(得分:1)

您可以使用Time Period Library for .NET TimePeriodChain 类。该集合确保链接时间段:

// ----------------------------------------------------------------------
public void TimePeriodChainSample()
{
  TimePeriodChain timePeriods = new TimePeriodChain();

  DateTime now = ClockProxy.Clock.Now;
  DateTime testDay = new DateTime( 2010, 7, 23 );

  // --- add ---
  timePeriods.Add( new TimeBlock(
                   TimeTrim.Hour( testDay, 8 ), Duration.Hours( 2 ) ) );
  timePeriods.Add( new TimeBlock( now, Duration.Hours( 1, 30 ) ) );
  timePeriods.Add( new TimeBlock( now, Duration.Hour ) );
  Console.WriteLine( "TimePeriodChain.Add(): " + timePeriods );
  // > TimePeriodChain.Add(): Count = 3; 23.07.2010 08:00:00 - 12:30:00 | 0.04:30
  foreach ( ITimePeriod timePeriod in timePeriods )
  {
    Console.WriteLine( "Item: " + timePeriod );
  }
  // > Item: 23.07.2010 08:00:00 - 10:00:00 | 02:00:00
  // > Item: 23.07.2010 10:00:00 - 11:30:00 | 01:30:00
  // > Item: 23.07.2010 11:30:00 - 12:30:00 | 01:00:00

  // --- insert ---
  timePeriods.Insert( 2, new TimeBlock( now, Duration.Minutes( 45 ) ) );
  Console.WriteLine( "TimePeriodChain.Insert(): " + timePeriods );
  // > TimePeriodChain.Insert(): Count = 4; 23.07.2010 08:00:00 - 13:15:00 | 0.05:15
  foreach ( ITimePeriod timePeriod in timePeriods )
  {
    Console.WriteLine( "Item: " + timePeriod );
  }
  // > Item: 23.07.2010 08:00:00 - 10:00:00 | 02:00:00
  // > Item: 23.07.2010 10:00:00 - 11:30:00 | 01:30:00
  // > Item: 23.07.2010 11:30:00 - 12:15:00 | 00:45:00
  // > Item: 23.07.2010 12:15:00 - 13:15:00 | 01:00:00
} // TimePeriodChainSample