public static DateTime Round(DateTime dateTime, TimeSpan roundBy)
long remainderTicks = dateTime.Ticks % roundBy.Ticks;
if (remainderTicks < roundBy.Ticks / 2)
return dateTime.AddTicks(-remainderTicks);
return dateTime.AddTicks(roundBy.Ticks - remainderTicks);
public static void Main()
var d = new DateTime(2018, 1, 1, 0, 1, 59, 999);
for (int i = 0; i < 100; i++)
d = d.AddSeconds(29).AddMilliseconds(i * 10);
var rounded = Round(d, TimeSpan.FromMinutes(1.5));
Console.WriteLine(String.Format("{0:HH:mm:ss.fff}, Rounded: {1:HH:mm:ss.fff}", d, rounded));