A friend of mine told me he had the following exercises at his interview :
You need to determine when a task will be completed if you are given :
- A date when the task is started
- The duration of the task in hours (how much hours it should take in total)
- The starting time and end time of a working day
Weekends are not work days and you can assume that there are no holidays. Taking this in consideration what's the date when the task will be completed (hours and minutes are taken in consideration) ?
(The original exercise was meant to work with database but I simplified it a bit.)
Here's my solution to the problem :
public class Program
{
private static void Main()
{
DateTime startOfTask = new DateTime(2016, 2, 27, 10, 30, 0);
TimeSpan durationOftask = new TimeSpan(20, 30, 0);
TimeSpan startOfDay = new TimeSpan(8, 30, 0);
TimeSpan endOfDay = new TimeSpan(16, 0, 0);
DateTime endOfTaskTime = GetEndOfTaskTime(durationOftask, startOfTask, startOfDay, endOfDay);
Console.WriteLine(endOfTaskTime.ToString("yyyy.MM.dd HH:mm"));
Console.ReadKey();
}
private static DateTime GetEndOfTaskTime(TimeSpan durationOftask, DateTime startOfTask, TimeSpan startOfDay,
TimeSpan endOfDay)
{
DateTime endOfTask = startOfTask;
TimeSpan timeWorkingOnTask = new TimeSpan(0, 0, 0);
while (timeWorkingOnTask < durationOftask)
{
if (endOfTask.DayOfWeek != DayOfWeek.Saturday && endOfTask.DayOfWeek != DayOfWeek.Sunday)
{
TimeSpan timeStartOfToday = new TimeSpan(endOfTask.Hour, endOfTask.Minute, 0);
TimeSpan workTime = timeStartOfToday == startOfDay
? endOfDay - startOfDay
: endOfDay - timeStartOfToday;
if (timeWorkingOnTask + workTime < durationOftask)
{
endOfTask = endOfTask.Add(workTime);
timeWorkingOnTask += workTime;
}
else
{
endOfTask = endOfTask.Add(durationOftask - timeWorkingOnTask);
break;
}
}
endOfTask = endOfTask.AddDays(1);
endOfTask = new DateTime(endOfTask.Year, endOfTask.Month, endOfTask.Day, startOfDay.Hours,
startOfDay.Minutes, 0);
}
return endOfTask;
}
}