Как насчет чего-то подобного?
static IEnumerable<DateTime> GetWorkingHourIntervals(DateTime clockIn, DateTime clockOut)
{
yield return clockIn;
DateTime d = new DateTime(clockIn.Year, clockIn.Month, clockIn.Day, clockIn.Hour, 0, 0, clockIn.Kind).AddHours(1);
while (d < clockOut)
{
yield return d;
d = d.AddHours(1);
}
yield return clockOut;
}
При этом используется блоков итераторов , но его можно легко переписать для возврата списка.
Пример использования:
static void Main(string[] args)
{
var clockIn = new DateTime(2011, 5, 25, 13, 40, 56);
var clockOut = new DateTime(2011, 5, 25, 18, 22, 12);
var hours = GetWorkingHourIntervals(clockIn, clockOut);
foreach (var h in hours)
Console.WriteLine(h);
Console.ReadLine();
}
Вывод:
2011-05-25 13:40:56
2011-05-25 14:00:00
2011-05-25 15:00:00
2011-05-25 16:00:00
2011-05-25 17:00:00
2011-05-25 18:00:00
2011-05-25 18:22:12
Обновление : LukeH был достаточно умен, чтобы предложить вам также скопировать DateTimeKind.Это действительно разумный шаг, если позже вы планируете преобразовать дату в местное время и обратно.