using System.Collections.Generic;
public static void Main()
var workingRosterStart = DateTime.Today.AddHours(12);
var workingRosterEnd = DateTime.Today.AddHours(20);
var validRanges = GetPartialTurndownAvailableOffsets(workingRosterStart, workingRosterEnd);
foreach(var k in validRanges)
Console.WriteLine(string.Format("{0}, {1}", k.Item1.ToString(), k.Item2.ToString()));
var bidStart = DateTime.Today.AddHours(17);
var bidEnd = DateTime.Today.AddHours(20);
var valid = ValidatePartialTurndownWithinPossibleHours(workingRosterStart, workingRosterEnd, bidStart, bidEnd);
Console.WriteLine(valid);
public static List<Tuple<DateTime, DateTime>> GetPartialTurndownAvailableOffsets(DateTime start, DateTime end)
var partialTurndownAvailableOffsets = new List<Tuple<DateTime, DateTime>>();
var scheduledHours = (end - start).TotalHours;
var partialTurndownBlockSize = 1;
var minimumPartialTurndownSize = 4;
for (int hour = partialTurndownBlockSize; hour < scheduledHours; hour += partialTurndownBlockSize)
if (hour >= minimumPartialTurndownSize)
partialTurndownAvailableOffsets.Add(new (start, start.AddHours(hour)));
partialTurndownAvailableOffsets.Add(new (end.AddHours(-1 * hour), end));
return partialTurndownAvailableOffsets;
private static bool ValidatePartialTurndownWithinPossibleHours(DateTime workingRosterStart, DateTime workingRosterEnd, DateTime bidStartTime, DateTime bidEndTime)
var offsetList = GetPartialTurndownAvailableOffsets(workingRosterStart, workingRosterEnd);
return offsetList.Contains(new (bidStartTime, bidEndTime));