计算下一次和舍入日期时间
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;
}
我相信一定有更漂亮的方法可以做到这一点,但它确实有效。
我有像 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;
}
我相信一定有更漂亮的方法可以做到这一点,但它确实有效。