舍入日期时间最接近第n分钟

时间:2019-04-18 02:10:51

标签: c#

我正在尝试将DateTime舍入到最近的7分钟。

我已经看到了许多用于c#的舍入函数,但是由于某些原因,我得到的结果与期望的结果不同。

给出以下时间:

var d = new DateTime(2019, 04, 15, 9, 40, 1, 0);

如果我想四舍五入到最近的7分钟,那么我希望答案是

2019-04-15 9:42:00     // 0, 7, 14, 21, 28, 35, 42 ?

输入/预期结果

new DateTime(2019, 04, 15, 9, 40, 0, 0);  // 9:42
new DateTime(2019, 04, 15, 9, 03, 0, 0);  // 9:07
new DateTime(2019, 04, 15, 9, 31, 0, 0);  // 9:35
new DateTime(2019, 04, 15, 9, 21, 0, 0);  // 9:21
new DateTime(2019, 04, 15, 9, 0, 0, 0);   // 9:00
new DateTime(2019, 04, 15, 9, 58, 0, 0);  // 10:00 (start again)

我所见过的各种DateTime舍入函数显示了以下答案,除非缺少某些内容,否则我无法理解为什么

9:41 or
9:43

舍入函数示例

public static DateTime RoundUp(this DateTime dt, TimeSpan d)
        {
            var modTicks = dt.Ticks % d.Ticks;
            var delta = modTicks != 0 ? d.Ticks - modTicks : 0;
            return new DateTime(dt.Ticks + delta, dt.Kind);
        }

DateTime RoundUp(DateTime dt, TimeSpan d)
{
    return new DateTime((dt.Ticks + d.Ticks - 1) / d.Ticks * d.Ticks, dt.Kind);
}

1 个答案:

答案 0 :(得分:1)

static DateTime RoundUpNMinute(DateTime dt, int n)
{
    var minute = dt.Minute;
    if (minute % n == 0)
        return dt;

    var minuteRoundUp = minute / n * n + n;

    if(minuteRoundUp > 60)
        return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, 0, 0, dt.Kind).AddHours(1);
    else
        return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, minuteRoundUp, 0, dt.Kind);
}

所有示例的结果相同。

相关问题