四个日期时间对象彼此接触/重叠

时间:2013-08-05 00:02:54

标签: c# datetime overlap

我试图找出2 DateTime个对象是否与其他2个DateTime对象相互接触/重叠。

我正在尝试检查很多案例。但我想知道是否有任何有效的方式做到这一点不同?可能是LINQ扩展名吗?

public IQueryable<Appointment> GetAllAppointments(DateTime startTime, DateTime endTime)
        {
            return _dbContext.Appointment.Where(x => x.Appointment.StartTime <= startTime && x.Appointment.EndTime >= endTime && x.Appointment.StartTime <= endTime && x.Appointment.EndTime <= startTime
                                    || x.Appointment.StartTime >= startTime && x.Appointment.EndTime <= endTime && x.Appointment.StartTime <= endTime && x.Appointment.EndTime <= startTime
                                    || x.Appointment.StartTime == startTime && x.Appointment.EndTime == endTime && x.Appointment.StartTime <= endTime && x.Appointment.EndTime <= startTime
                                    || x.Appointment.StartTime >= startTime && x.Appointment.EndTime >= endTime
                                    || x.Appointment.StartTime <= startTime && x.Appointment.EndTime >= endTime);
        }

约会不应该互相“触碰”。约会结束时,下一次开始预约不应该从上一个日期和时间结束的日期和时间开始。

1 个答案:

答案 0 :(得分:1)

您可以使用Time Period Library for .NET检测重叠/触摸时间段:

// ----------------------------------------------------------------------
public void TimeRangeSample()
{
  // --- time range 1 ---
  TimeRange timeRange1 = new TimeRange(
    new DateTime( 2011, 2, 22, 14, 0, 0 ),
    new DateTime( 2011, 2, 22, 18, 0, 0 ) );
  Console.WriteLine( "TimeRange1: " + timeRange1 );
  // > TimeRange1: 22.02.2011 14:00:00 - 18:00:00 | 04:00:00

  // --- time range 2 ---
  TimeRange timeRange2 = new TimeRange(
    new DateTime( 2011, 2, 22, 15, 0, 0 ),
    new TimeSpan( 2, 0, 0 ) );
  Console.WriteLine( "TimeRange2: " + timeRange2 );
  // > TimeRange2: 22.02.2011 15:00:00 - 17:00:00 | 02:00:00

  // --- time range 3 ---
  TimeRange timeRange3 = new TimeRange(
    new DateTime( 2011, 2, 22, 16, 0, 0 ),
    new DateTime( 2011, 2, 22, 21, 0, 0 ) );
  Console.WriteLine( "TimeRange3: " + timeRange3 );
  // > TimeRange3: 22.02.2011 16:00:00 - 21:00:00 | 05:00:00

  // --- relation ---
  Console.WriteLine( "TimeRange1.GetRelation( TimeRange2 ): " +
                     timeRange1.GetRelation( timeRange2 ) );
  // > TimeRange1.GetRelation( TimeRange2 ): Enclosing
  Console.WriteLine( "TimeRange1.GetRelation( TimeRange3 ): " +
                     timeRange1.GetRelation( timeRange3 ) );
  // > TimeRange1.GetRelation( TimeRange3 ): EndInside
  Console.WriteLine( "TimeRange3.GetRelation( TimeRange2 ): " +
                     timeRange3.GetRelation( timeRange2 ) );
  // > TimeRange3.GetRelation( TimeRange2 ): StartInside

  // --- intersection ---
  Console.WriteLine( "TimeRange1.GetIntersection( TimeRange2 ): " +
                     timeRange1.GetIntersection( timeRange2 ) );
  // > TimeRange1.GetIntersection( TimeRange2 ):
  //             22.02.2011 15:00:00 - 17:00:00 | 02:00:00
  Console.WriteLine( "TimeRange1.GetIntersection( TimeRange3 ): " +
                     timeRange1.GetIntersection( timeRange3 ) );
  // > TimeRange1.GetIntersection( TimeRange3 ):
  //             22.02.2011 16:00:00 - 18:00:00 | 02:00:00
  Console.WriteLine( "TimeRange3.GetIntersection( TimeRange2 ): " +
                     timeRange3.GetIntersection( timeRange2 ) );
  // > TimeRange3.GetIntersection( TimeRange2 ):
  //             22.02.2011 16:00:00 - 17:00:00 | 01:00:00
} // TimeRangeSample