using System.Collections.Generic;
var start = new DateTime(2024, 10, 01, 08, 00, 00);
var end = new DateTime(2024, 10, 20, 12, 00, 00);
var runtimes = new TimeSpan[] {
new TimeSpan(06, 00, 00),
new TimeSpan(11, 00, 00),
new TimeSpan(15, 00, 00),
new TimeSpan(18, 00, 00),
var daysToRun = (end.Date - start.Date).Days;
var datesToRun = Enumerable.Range(0, daysToRun + 1).Select(days => start.Date.AddDays(days));
var dayBlocks = datesToRun.Select(date => runtimes
.Select((runtime, index) => {
var startDate = date.AddDays(index == 0 ? -1 : 0);
var startTime = index == 0 ? runtimes[^1] : runtimes[index - 1];
return new Window(startDate + startTime, date + runtime);
.Where(window => window.End >= start && window.Start <= end)
.Select(window => window with {
Start = new [] {window.Start, start}.Max(),
End = new [] {window.End, end}.Min(),
).Where(block => block.Any());
foreach (var block in dayBlocks) {
foreach (var run in block) {
set "startTime={run.Start}" && set "endTime={run.End}" && call:RunAppForTime
record Window(DateTime Start, DateTime End);