using System.Collections.Generic;
public static void Main()
var timeStart = new DateTime(2025, 1, 15, 12, 45, 18);
var timeEnd = new DateTime(2025, 7, 25, 19, 55, 40);
var timeGrain = "1 hour";
var periods = SplitPeriodByMonth(timeStart, timeEnd, timeGrain);
foreach (var period in periods)
Console.WriteLine($"Start: {period.Start}, End: {period.End}");
public static List<(DateTime Start, DateTime End)> SplitPeriodByMonth(DateTime timeStart, DateTime timeEnd, string timeGrain)
var periods = new List<(DateTime Start, DateTime End)>();
var currentStart = timeStart;
while (currentStart <= timeEnd)
if (timeGrain.Equals("1 hour", StringComparison.OrdinalIgnoreCase))
currentEnd = currentStart.AddMonths(monthsToSplit).AddTicks(-1);
currentEnd = new DateTime(currentStart.Year, currentStart.Month, 1)
.AddMonths(monthsToSplit)
if (currentEnd > timeEnd)
periods.Add((currentStart, currentEnd));
currentStart = currentEnd.AddTicks(1);