public int CalculateWeekdays(DateTime startDate, DateTime endDate)
startDate = startDate.Date;
int numDays = 1 + Convert.ToInt32((endDate - startDate).TotalDays);
int numSaturdays = (numDays + Convert.ToInt32(startDate.DayOfWeek)) / 7;
return numDays - 2 * numSaturdays
- (startDate.DayOfWeek == DayOfWeek.Sunday ? 1 : 0)
+ (endDate.DayOfWeek == DayOfWeek.Saturday ? 1 : 0);
public static void Main(string[] args)
var d1 = new DateTime(2016, 5, 1);
var d2 = new DateTime(2016, 5, 31);
var d3 = new DateTime(2016, 2, 1);
var d4 = new DateTime(2016, 2, 29);
var d5 = new DateTime(2016, 3, 1);
var d6 = new DateTime(2016, 3, 31);
var d7 = new DateTime(2016, 6, 1);
var d8 = new DateTime(2016, 6, 30);
var d9 = new DateTime(2016, 9, 1);
var d10 = new DateTime(2016, 9, 30);
var d11 = new DateTime(2016, 7, 1);
var d12 = new DateTime(2016, 7, 31);
var d13 = new DateTime(2016, 10, 1);
var d14 = new DateTime(2016, 10, 31);
var d15 = new DateTime(2009, 11, 30);
var d16 = new DateTime(2009, 12, 4);
var differ = new DateDiffer();
int numFromSunday = differ.CalculateWeekdays(d1, d2);
int numFromMonday = differ.CalculateWeekdays(d3, d4);
int numFromTuesday = differ.CalculateWeekdays(d5, d6);
int numFromWednesday = differ.CalculateWeekdays(d7, d8);
int numFromThursday = differ.CalculateWeekdays(d9, d10);
int numFromFriday = differ.CalculateWeekdays(d11, d12);
int numFromSaturday = differ.CalculateWeekdays(d13, d14);
int exampleFromOp = differ.CalculateWeekdays(d15, d16);
Assert.Equal(22, numFromSunday);
Assert.Equal(21, numFromMonday);
Assert.Equal(23, numFromTuesday);
Assert.Equal(22, numFromWednesday);
Assert.Equal(22, numFromThursday);
Assert.Equal(21, numFromFriday);
Assert.Equal(21, numFromSaturday);
Assert.Equal(5, exampleFromOp);
Console.WriteLine($"{nameof(numFromSunday)} = {numFromSunday}");
Console.WriteLine($"{nameof(numFromMonday)} = {numFromMonday}");
Console.WriteLine($"{nameof(numFromTuesday)} = {numFromTuesday}");
Console.WriteLine($"{nameof(numFromWednesday)} = {numFromWednesday}");
Console.WriteLine($"{nameof(numFromThursday)} = {numFromThursday}");
Console.WriteLine($"{nameof(numFromFriday)} = {numFromFriday}");
Console.WriteLine($"{nameof(numFromSaturday)} = {numFromSaturday}");
Console.WriteLine($"{nameof(exampleFromOp)} = {exampleFromOp}");