public static class Program
public static DateTime RoundToNearestMinuteProper(this DateTime dt, int rndmin, RoundingDirection directn)
long ticksPerInterval = TimeSpan.FromMinutes(rndmin).Ticks;
long modTicks = dt.Ticks % ticksPerInterval;
case RoundingDirection.Up:
delta = (modTicks == 0) ? 0 : ticksPerInterval - modTicks;
case RoundingDirection.Down:
case RoundingDirection.Nearest:
delta = (modTicks > ticksPerInterval / 2) ? ticksPerInterval - modTicks : -modTicks;
return new DateTime(dt.Ticks + delta, dt.Kind);
public enum RoundingDirection
public static void Main()
var dt = new DateTime(2018, 08, 03, 10, 7, 31, 000);
Console.WriteLine(dt.RoundToNearestMinuteProper(15, RoundingDirection.Up));
Console.WriteLine(dt.RoundToNearestMinuteProper(15, RoundingDirection.Down));
Console.WriteLine(dt.RoundToNearestMinuteProper(15, RoundingDirection.Nearest));