79076911

Date: 2024-10-11 05:37:21
Score: 1
Natty:
Report link

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);
}
Reasons:
  • RegEx Blacklisted phrase (1.5): I do not have 50 reputation
  • Long answer (-1):
  • Has code block (-0.5):
  • Low reputation (1):
Posted by: William Robertson