【发布时间】:2010-11-26 11:50:57
【问题描述】:
我想将日期/时间四舍五入到图表应用程序的最近间隔。我想要一个如下的扩展方法签名,以便可以实现任何精度级别的舍入:
static DateTime Round(this DateTime date, TimeSpan span);
这个想法是,如果我在十分钟的时间跨度内通过,它将四舍五入到最接近的十分钟间隔。我无法理解实现,希望你们中的一个人以前写过或使用过类似的东西。
我认为地板、天花板或最近的实现都可以。
有什么想法吗?
编辑:感谢@tvanfosson 和@ShuggyCoUk,实现如下所示:
public static class DateExtensions {
public static DateTime Round(this DateTime date, TimeSpan span) {
long ticks = (date.Ticks + (span.Ticks / 2) + 1)/ span.Ticks;
return new DateTime(ticks * span.Ticks);
}
public static DateTime Floor(this DateTime date, TimeSpan span) {
long ticks = (date.Ticks / span.Ticks);
return new DateTime(ticks * span.Ticks);
}
public static DateTime Ceil(this DateTime date, TimeSpan span) {
long ticks = (date.Ticks + span.Ticks - 1) / span.Ticks;
return new DateTime(ticks * span.Ticks);
}
}
并且是这样调用的:
DateTime nearestHour = DateTime.Now.Round(new TimeSpan(1,0,0));
DateTime minuteCeiling = DateTime.Now.Ceil(new TimeSpan(0,1,0));
DateTime weekFloor = DateTime.Now.Floor(new TimeSpan(7,0,0,0));
...
干杯!
【问题讨论】:
-
这里的一些实现也可能有帮助:stackoverflow.com/questions/766626/…
-
不要忘记将原始的 DateTimeKind 添加到新创建的日期例如:new DateTime(ticks * span.Ticks, date.Kind);