一尘不染

舍入DateTime对象

algorithm

我想将日期/时间四舍五入到制图应用程序的最近间隔。我想要如下扩展方法签名,以便可以达到任何精度级别的舍入:

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));
...

干杯!


阅读 188

收藏
2020-07-28

共1个答案

一尘不染

地板

long ticks = date.Ticks / span.Ticks;

return new DateTime( ticks * span.Ticks );

舍入(中点向上)

long ticks = (date.Ticks + (span.Ticks / 2) + 1)/ span.Ticks;

return new DateTime( ticks * span.Ticks );

天花板

long ticks = (date.Ticks + span.Ticks - 1)/ span.Ticks;

return new DateTime( ticks * span.Ticks );
2020-07-28