using System.Collections.Generic;
public static class TestHelper
public static IEnumerable<TestData> InitTestData()
var result = new List<TestData>
new TestData(DateTime.Parse("04/09/2022 04:57:00 PM"), 6, DateTime.Parse("04/18/2022 06:00:00 PM")),
new TestData(DateTime.Parse("04/07/2022 04:57:00 PM"), 4, DateTime.Parse("04/12/2022 06:00:00 PM")),
new TestData(DateTime.Parse("04/07/2022 08:57:00 PM"), 4, DateTime.Parse("04/13/2022 06:00:00 PM")),
new TestData(DateTime.Parse("04/07/2022 04:57:00 PM"), 8, DateTime.Parse("04/18/2022 06:00:00 PM")),
new TestData(DateTime.Parse("04/08/2022 05:57:00 PM"), 6, DateTime.Parse("04/18/2022 06:00:00 PM"))
public static void Main()
var testData = TestHelper.InitTestData();
var dateCalculator = new DateCalculator();
foreach (var data in testData)
var dueDate = dateCalculator.AddBusinessDays(data.InitialDate, data.DueDays);
Console.Write("Initial date: ");
Console.WriteLine(data.InitialDate.ToString("ddd, MM/dd/yyyy HH:mm:ss"));
Console.Write("Due date: ");
Console.WriteLine(dueDate.ToString("ddd, MM/dd/yyyy HH:mm:ss"));
Console.Write("Expected Due date: ");
Console.WriteLine(data.ExpectedDueDate.ToString("ddd, MM/dd/yyyy HH:mm:ss"));
Console.Write("Calculations correct: ");
Console.WriteLine(dueDate == data.ExpectedDueDate);
public class DateCalculator
private static readonly TimeSpan START_WORKING_HOUR = new TimeSpan(9, 0, 0);
private static readonly TimeSpan END_WORKING_HOUR = new TimeSpan(18, 0, 0);
private static readonly TimeSpan END_WORKING_HOUR_FRIDAY = new TimeSpan(17, 0, 0);
public DateTime AddBusinessDays(DateTime sourceTime, int addDays)
var resultDate = sourceTime;
var workingDay = isWorkingDay(resultDate);
resultDate = resultDate.AddDays(1);
workingDay = isWorkingDay( resultDate );
resultDate = resetToMorningTime(resultDate);
if (isBeforeEndOfWorkingTime(resultDate)) {
resultDate = resultDate.AddDays(1);
if(isWorkingDay(resultDate) ) {
resultDate = resetToEveningTime(resultDate);
private bool isWorkingDay(DateTime date)
case DayOfWeek.Wednesday:
private bool isBeforeEndOfWorkingTime(DateTime dateTime)
switch (dateTime.DayOfWeek)
case DayOfWeek.Wednesday:
result = dateTime.TimeOfDay < END_WORKING_HOUR;
result = dateTime.TimeOfDay < END_WORKING_HOUR_FRIDAY;
private DateTime resetToMorningTime(DateTime dateTime)
var result = dateTime.Date + START_WORKING_HOUR;
private DateTime resetToEveningTime(DateTime dateTime)
switch (dateTime.DayOfWeek)
case DayOfWeek.Wednesday:
result = dateTime.Date + END_WORKING_HOUR;
result = dateTime.Date + END_WORKING_HOUR_FRIDAY;
public DateTime InitialDate {get;set;}
public int DueDays {get;set;}
public DateTime ExpectedDueDate {get;set;}
public TestData(DateTime initialDate, int dueDays, DateTime expectedDueDate)
InitialDate = initialDate;
ExpectedDueDate = expectedDueDate;