I'm sure that the answers to this is not an appropriate place to leave this, but as I do not have 50 reputation I am unable to leave a comment.
The currently accepted answer giving a solution for a RoundUpOnMidpoint does not work if you are attempting to round a datetime 1 tick before the midpoint. The following test written with FluentAssertions proves this.
[Test]
public void RoundUpOnMidpoint_JustBeforeMidpoint()
{
var span = TimeSpan.FromMinutes(1);
var originalDateTime = new DateTime(2021, 08, 26, 20, 01, 0);
var midpoint = originalDateTime + (span / 2);
var justBeforeMidpoint = midpoint.AddTicks(-1);
RoundUpOnMidpoint(justBeforeMidpoint, span).Should().Be(originalDateTime, $"{justBeforeMidpoint:O} is one tick closer to {originalDateTime:O} than {originalDateTime + span:O}");
DateTime RoundUpOnMidpoint(DateTime date, TimeSpan span)
{
var ticks = (date.Ticks + span.Ticks / 2 + 1) / span.Ticks;
return new DateTime(ticks * span.Ticks, date.Kind);
}
}
The test fails and says
Expected RoundUpOnMidpoint(justBeforeMidpoint, span) to be <2021-08-26 20:01:00> because 2021-08-26T20:01:29.9999999 is one tick closer to 2021-08-26T20:01:00.0000000 than 2021-08-26T20:02:00.0000000, but found <2021-08-26 20:02:00>.
A more correct round up on midpoint would be.
DateTime RoundUpOnMidpoint(DateTime date, TimeSpan span)
{
var ticks = (date.Ticks + span.Ticks / 2) / span.Ticks;
return new DateTime(ticks * span.Ticks, date.Kind);
}