计算下一次和舍入日期时间

Calculating next time and rounding date-time

我有像 2019-02-10 这样的日期时间 20:39:23 我想将这个时间四舍五入到下一个时间,距离最近的时间相隔 15 分钟。所以这意味着下一个应该是 2019-02-10 21:45:00 或者另一个例子 21:24:17 应该变成 21:45:00...下面的代码工作正常,直到我有像 2019-02- 这样的日期时间10 23:54:20。那么下一轮应该是 2019-03-10 00:00:00 但我得到 2019-02-10 00:00:00。

这是我的做法:

static void Main(string[] args)
{
    DateTime dt = DateTime.Parse("2019-02-10 23:54:23");

    var interval = TimeSpan.FromMinutes(15);

     DateTime last = NextTime(dt, interval);

     Console.WriteLine(last);

    }

    private static DateTime NextTime(DateTime value, TimeSpan interval)
    {
        var temp = value.Add(new TimeSpan(interval.Ticks / 2));
        var time = new TimeSpan((temp.TimeOfDay.Ticks / interval.Ticks) * interval.Ticks);

        return value.Date.Add(time);
    }

对于输出,我得到 2019-02-10 00:00:00 而不是 2019-03-10 00:00:00

想不通为什么不转到第二天...

return 值是根据错误的变量计算的。使用 temp 而不是 value:

 private static DateTime NextTime(DateTime value, TimeSpan interval)
 {
     var temp = value.Add(new TimeSpan(interval.Ticks / 2));
     var time = new TimeSpan((temp.TimeOfDay.Ticks / interval.Ticks) * interval.Ticks);

     return temp.Date.Add(time);
 }

这是因为您要将间隔添加到该值。如果它滚动 midnight/end 一天,你的 value.Date 将 return 错误的一天。由于您存储 temp,因此您可以 return temp.Date.Add(time)

使用 DateTime.Add(TimeSpan) 时间在日期中是连续的。

我已经按照这种方式更改了您的代码并且成功了:

    private static DateTime NextTime(DateTime value, TimeSpan interval)
    {
        var temp = value.Add(new TimeSpan(interval.Ticks / 2));
        var time = new TimeSpan((temp.TimeOfDay.Ticks / interval.Ticks) * interval.Ticks);
        if (time == new TimeSpan(0, 0, 0)) { time = new TimeSpan(24, 0,0); }
        var timeDiff = time - value.TimeOfDay;

        var finalDate = value.AddHours(timeDiff.Hours);
        finalDate = finalDate.AddMinutes(timeDiff.Minutes);
        finalDate = finalDate.AddSeconds(timeDiff.Seconds);

        return finalDate;
    }

我相信一定有更漂亮的方法可以做到这一点,但它确实有效。