Questa funzione C# permette di verificare se due range di date sono sovrapposti o meno.

Considerando di avere due eventi chiamati ev1 ed ev2 le casistiche che possiamo incontrare sono:
1) ev2 contenuto in ev1
    ev1: +---------------+ 
    ev2:       +---+
2) ev1 contenuto in ev2 
    ev1:       +--------+
    ev2: +-----------------+
3) parzialmente contenuto, ev1 inizia prima di ev2
    ev1:   +--------+
    ev2:        +---------------+
4) parzialmente contenuto, ev1 inizia dopo ev2
    ev1:       +--------+
    ev2: +--------+
5) eventi esattamente sovrapposti
    ev1: +--------+
    ev2: +--------+
6) ev1 contenuto in ev2 con data inizio uguale
    ev1: +--------+
    ev2: +---------------+
7) ev1 contenuto in ev2 con data fine uguale
    ev1:      +---+
    ev2: +--------+
il codice per fare la verifica è:
C#
/// <summary>
/// Verifica se due range di date si sovrappongono
/// </summary>
/// <param name="ev1Begin">inizio primo range</param>
/// <param name="ev1End">fine primo range</param>
/// <param name="ev2Begin">inizio secondo range</param>
/// <param name="ev2End">fine secondo range</param>
/// <returns>true se sovrapposti</returns>
public static bool VerificaSovrapposizioneRangeDate(DateTime ev1Begin, DateTime ev1End, DateTime ev2Begin, DateTime ev2End)
{
  if (ev1Begin > ev1End || ev2Begin > ev2End)
  {
    //return true;  // se le date sono invertite indico come periodo sovrapposto
    // in laternativa
    throw new ArgumentException("Date invertite");
  }
  //in alternativa inverto le date
  //if (ev1Begin > ev1End)
  //{
  //  DateTime tmp = ev1Begin;
  //  ev1Begin = ev1End;
  //  ev1End = tmp;
  //}
  //if (ev2Begin > ev2End)
  //{
  //  DateTime tmp = ev2Begin;
  //  ev2Begin = ev2End;
  //  ev2End = tmp;
  //}

  if ((ev1Begin <= ev2Begin && ev1End >= ev2End)  // 1 e 5
    || (ev1Begin >= ev2Begin && ev1End <= ev2End) // 2, 6 e 7
    || (ev1Begin < ev2Begin && ev1End > ev2Begin) // 3
    || (ev1Begin < ev2End && ev1End > ev2End)     // 4
    )
    return true;
  else
    return false;
}
per testarlo:
C#
static void Main(string[] args)
{
  DateTime ev1Begin = new DateTime(2012, 7, 10, 12, 0, 0);
  DateTime ev1End = new DateTime(2012, 7, 10, 12, 10, 0);

  DateTime ev2Begin = new DateTime(2012, 7, 10, 10, 0, 0);
  DateTime ev2End = new DateTime(2012, 7, 10, 13, 0, 0);

  if (VerificaSovrapposizioneRangeDate(ev1Begin, ev1End, ev2Begin,ev2End))
  {
    Console.WriteLine("*** SOVRAPPOSTI ***");
  }
  else
  {
    Console.WriteLine("NON sovrapposti");
  }

  Console.WriteLine(" aaa: " + VerificaSovrapposizioneRangeDate(ev1Begin, ev1End, ev2Begin, ev2End));

  Console.WriteLine("1) ev1Begin <= ev2Begin && ev1End >= ev2End   -> " + (ev1Begin <= ev2Begin && ev1End >= ev2End).ToString());
  Console.WriteLine("2) ev1Begin >  ev2Begin && ev1End <  ev2End   -> " + (ev1Begin > ev2Begin && ev1End < ev2End).ToString());
  Console.WriteLine("3) ev1Begin <  ev2Begin && ev1End <  ev2Begin -> " + (ev1Begin < ev2Begin && ev1End < ev2Begin).ToString());
  Console.WriteLine("4) ev1Begin <  ev2End   && ev1End >  ev2End   -> " + (ev1Begin < ev2End && ev1End > ev2End).ToString());

  Console.WriteLine("fine");
  Console.ReadKey();
}
Potrebbe interessarti anche: