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

时间:2019-10-02 20:04:46

标签: c# datetime timespan

我的日期时间如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。

这是我的做法:

p.Swells = []Swell{}
p.Swells = append(p.Swells, Swell{ Slot: 0, Height: 2.20, Period: 15.5,Dir: 300 })
p.Swells = append(p.Swells, Swell{ Slot: 1, Height: 1.20, Period: 5.5,Dir: 90 })
p.Swells = append(p.Swells, Swell{ Slot: 5, Height: 0.98, Period: 7.5,Dir: 180 })

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

无法弄清为什么不转到第二天...

2 个答案:

答案 0 :(得分:1)

从错误的变量计算返回值。使用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);
 }

之所以这样做,是因为您要将间隔添加到值中。如果滚动到午夜/一天结束,您的value.Date将返回错误的日期。由于您存储了temp,因此您可以返回temp.Date.Add(time)

答案 1 :(得分:0)

使用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;
    }

我相信这样做必须要有一些更漂亮的方法,但是它能起作用。