I've modified the above program so that, if you enter a negative or zero interval, it assumes that the interval must end on the following day i.e. 24 hours should be added:
using System;
class Program
{
static void Main()
{
DateTime mainStart = DateTime.Parse("09:20:00");
DateTime mainEnd = DateTime.Parse("05:00:00");
DateTime intervalStart = DateTime.Parse("06:00:00");
DateTime intervalEnd = DateTime.Parse("05:40:00");
TimeSpan ts = GetIntersection(mainStart, mainEnd, intervalStart, intervalEnd);
Console.WriteLine(ts);
intervalStart = DateTime.Parse("14:00:00");
intervalEnd = DateTime.Parse("01:00:00");
ts = GetIntersection(mainStart, mainEnd, intervalStart, intervalEnd);
Console.WriteLine(ts);
Console.ReadLine();
}
public static TimeSpan GetIntersection(DateTime mainStart, DateTime mainEnd, DateTime intervalStart, DateTime intervalEnd)
{
if (mainStart >= mainEnd)
{
mainEnd += new TimeSpan(24,0,0);
}
if (intervalStart >= intervalEnd)
{
intervalEnd += new TimeSpan(24,0,0);
}
if(intervalStart >= mainEnd || intervalEnd <= mainStart)
{
return TimeSpan.Zero;
}
if (intervalStart >= mainStart && intervalEnd <= mainEnd)
{
return intervalEnd - intervalStart;
}
DateTime tempStart = intervalStart;
DateTime tempEnd = intervalEnd;
if (intervalStart < mainStart) tempStart = mainStart;
if (intervalEnd > mainEnd) tempEnd = mainEnd;
return tempEnd - tempStart;
}
}