我的日期时间如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
无法弄清为什么不转到第二天...
答案 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;
}
我相信这样做必须要有一些更漂亮的方法,但是它能起作用。