Skip to content

Instantly share code, notes, and snippets.

@VaclavElias
Created April 11, 2022 12:46
Show Gist options
  • Save VaclavElias/3de6649428244a92b5480e53498af0a1 to your computer and use it in GitHub Desktop.
Save VaclavElias/3de6649428244a92b5480e53498af0a1 to your computer and use it in GitHub Desktop.
var startTime = new DateTime(2022, 4, 11, 8, 0, 0);
var endTime = new DateTime(2022, 4, 11, 17, 0, 0);
var breaks = new List<(DateTime Start, DateTime End)>
{
(new DateTime(2022, 4, 11, 12, 0, 0), new DateTime(2022, 4, 11, 13, 0, 0)),
(new DateTime(2022, 4, 11, 15, 0, 0), new DateTime(2022, 4, 11, 15, 30, 0))
};
// Validate breaks, merge them if needed
Console.WriteLine($"Worktime: {startTime} - {endTime}");
foreach (var item in breaks)
{
Console.WriteLine($"Break: {item.Start} - {item.End}");
}
var workingTime = new List<(DateTime Start, DateTime End)>();
var firstBreakStart = GetFirstBreak();
workingTime.Add(new(startTime, firstBreakStart == DateTime.MinValue ? endTime : firstBreakStart));
// no breaks
if (firstBreakStart == DateTime.MinValue)
{
ShowResult();
return;
};
for (var i = 0; i < breaks.Count - 1; i++)
{
workingTime.Add(new(breaks[i].End, breaks[i + 1].Start));
}
var lastBreakEnd = GetLastBreak();
if (lastBreakEnd != DateTime.MinValue) workingTime.Add(new(lastBreakEnd, endTime));
ShowResult();
DateTime GetFirstBreak() => breaks.OrderBy(s => s.Start).FirstOrDefault().Start;
DateTime GetLastBreak() => breaks.OrderBy(s => s.Start).LastOrDefault().End;
void ShowResult()
{
Console.WriteLine("");
Console.WriteLine("");
foreach (var item in workingTime)
{
Console.WriteLine($"Worktime: {item.Start} - {item.End}");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment