Verifica sovrapposizione range di date in C#
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:
il codice per fare la verifica è:
per testarlo:
Considerando di avere due eventi chiamati ev1 ed ev2 le casistiche che possiamo incontrare sono:
Text
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: +--------+
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;
}
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();
}