using System.Collections.Generic;
public void Main(string[] args)
DateTime scheduleStart = new DateTime(2021, 1, 7, 1, 0, 0, 0, DateTimeKind.Local);
DateTime scheduleEnd = scheduleStart.AddDays(1).AddMinutes(-1);
DateTime now = scheduleStart.AddMilliseconds(-33);
long ticksPerInterval = TimeSpan.TicksPerMinute;
SortedList<DateTime, ScheduledTime> scheduledTimesList = new SortedList<DateTime, ScheduledTime>();
for (int i = 0; i <= 7; i++)
DateTime tmpTime = new DateTime(scheduleStart.Ticks);
scheduledTimesList.Add(tmpTime.AddDays(i).Date, null);
for (int i = 0; i <= 7; i++)
DateTime tmpTime = new DateTime(scheduleStart.Ticks);
ScheduledTime tmpSched = new ScheduledTime();
int daysOffset = (int)(tmpTime.AddDays(i).Date - scheduleStart.Date).TotalDays;
tmpSched.StartTime = scheduleStart.AddDays(daysOffset);
tmpSched.EndTime = scheduleEnd.AddDays(daysOffset);
scheduledTimesList[tmpTime.AddDays(i).Date] = tmpSched;
Console.Out.WriteLine("FillEverydayDates: i = " + i.ToString() + ", start = " + tmpSched.StartTime.ToString() + ", end = " + tmpSched.EndTime.ToString());
ScheduledTime schedTime = null;
foreach (KeyValuePair<DateTime,ScheduledTime> kvp in scheduledTimesList)
ScheduledTime tmpTime = new ScheduledTime(kvp.Value);
Console.Out.WriteLine("ScheduleNext: kvp = " + kvp.Key.ToShortDateString() + " / " + kvp.Value.StartTime.ToString());
if (tmpTime != null && kvp.Key.Date == scheduleStart.Date)
Console.Out.WriteLine("Same date");
if (scheduleStart < tmpTime.EndTime || useMinTime)
Console.Out.WriteLine(">> end time ok");
if (tmpTime.StartTime > scheduleStart || useMinTime)
Console.Out.WriteLine(">> start time ok");
schedTime = new ScheduledTime(tmpTime);
Console.Out.WriteLine(">> start time NOT ok");
DateTime startTime = new DateTime(tmpTime.StartTime.Ticks);
DateTime endTime = new DateTime(tmpTime.EndTime.Ticks);
while (startTime < scheduleStart)
Console.Out.WriteLine(">> LOOP " + startTime.ToString() + " < " + scheduleStart.ToString());
startTime = startTime.AddTicks(ticksPerInterval * interval);
Console.Out.WriteLine(">> >> New start time = " + startTime.ToString());
if (startTime >= endTime)
Console.Out.WriteLine(">> >> Past end time; add one day");
scheduleStart = scheduleStart.AddDays(1);
if (startTime >= scheduleStart)
Console.Out.WriteLine(">> >> Past start time - interval looks good");
tmpTime.StartTime = startTime;
tmpTime.EndTime = tmpTime.StartTime.AddTicks(ticksPerInterval * interval);
schedTime = new ScheduledTime(tmpTime);
Console.Out.WriteLine(">> end time NOT ok");
scheduleStart = scheduleStart.AddDays(1);
Console.Out.WriteLine("Different date: " + scheduleStart.Date.ToShortDateString());
scheduleStart = scheduleStart.AddDays(1);
Console.Out.WriteLine("Successfully scheduled for " + schedTime.StartTime.ToString() + " to " + schedTime.EndTime.ToString());
Console.Out.WriteLine("No scheduled time set for " + scheduleStart.DayOfWeek.ToString());
private class ScheduledTime
public DateTime StartTime;
public ScheduledTime() {}
public ScheduledTime(ScheduledTime other)
StartTime = other.StartTime;